什么是JIT,JDK17移除了JIT?

前言

  • 各大官号发布关于JDK17的文章中都提到了JDK17的变动中移除了实验性的AOT与JIT ,AOT就不说了吧,无关紧要的感觉。但是其中并没有说明什么是实验性的JIT,本文在此做一个自己的解释。
  • Java靠什么起家的不用说了吧,那必然是JIT。也正因为有JIT的存在才使得Java在运行速度上有了显著的提升,目前来说甚至不弱于C亦或是C++两位巨头般的存在。

疑惑的同时可能是混淆了一个概念。JIT指的是一类东西,而不是一个东西。就比如我们说的JVM,而HotSpot就是一个具体的JVM。

jdk17发布文档中移除和弃用项

译文(JEP 410):
移除实验性的 AOT 和 JIT 编译器 — 基于 Java 的提前 (AOT) 和即时 (JIT) 实验性编译器并未被广泛采用。作为一个选择性功能,AOT 和 JIT 编译器已在 JDK 16 中移除,本次在 JDK 源代码中移除。

这样说确实是移除了哈。

疑问:

  1. 移除了JIT吗?移除了,不过是实验性的JIT
  2. 那什么是实验性的JIT?见下文

什么是实验性的JIT?

最终在JDK17的发布文档中找到了答案,见下图

什么是JIT,JDK17移除了JIT?_第1张图片
译文:
Graal 编译器通过JEP 317在 JDK 10 中作为实验性 JIT 编译器提供。

在文档 动机中给出了解释,是Graal 编译器在 JDK 10 中作为实验性 JIT 编译器。所以之前在JDK10以后,JVM(指HotStpot虚拟机)中的JIT是有三款的,即 C1('客户端编译器”(Client Compiler))、C2(“服务端编译器”(Server Compiler))以及Graal 编译器

结论

结论就是 JDK17中移除的并非我们所认为的那个JIT,而是Graal 编译器。我们所认为的JIT其实就是C2。

课外补充说明

什么是JIT?HotSpot有几个JIT?

目前主流的两款商用Java虚拟机(HotSpot、OpenJ9)里,Java程序最初都是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁,就会把这些代码认定为“热点代码”(Hot Spot Code),为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成本地机器码,并以各种手段尽可能地进行代码优化,运行时完成这个任务的后端编译器被称为即时编译器。

HotSpot虚拟机中内置了两个(或三个)即时编译器,其中有两个编译器存在已久,分别被称为“客户端编译器”(Client Compiler)和“服务端编译器”(Server Compiler),或者简称为C1编译器和C2编译器(部分资料和JDK源码中C2也叫Opto编译器),第三个是在JDK10时才出现的,也是实验中的、长期目标是代替C2的Graal编译器,也就是本文所讨论的JIT

关于JIT详细触发条件可在本人另一篇文章中有详细介绍(个人博客)关于JIT的介绍与其他详细信息,也可以点击本人主页查看本平台的文章。

你可能感兴趣的:(jvm,java,开发语言)