我对JIT编译器感到困惑,
- 什么是JIT编译器?
- JIT编译器是在每次执行或每次JVM加载之前编译字节码吗?
即时编译(JIT)编译器是一个程序,它将Java字节码(包含必须解释的指令的程序)转换为可直接发送到处理器的指令。
JIT编译器作为独立的平台相关本机库提供。如果存在JIT编译器库,Java VM会初始化Java Native Interface(JNI)本机代码钩子,以调用该库中可用的JIT函数而不是解释器中等效的函数。java.lang.Compiler类用于加载本机库并在JIT编译器内启动初始化。JIT编译器使用自己的调用程序。Sun产品发布会检查ACC_MACHINE_COMPILED值的方法访问位,以通知解释器该方法的代码已经被编译并存储在已加载的类中。当首次调用方法时(取决于JVM供应商),JIT编译器会将方法块编译为本机代码,并将其存储在该方法的代码块中。
一旦代码已编译,Sun平台上使用的ACC_MACHINE_COMPILED位被设置。
首先要记住的是,JIT编译器在第二次(取决于JVM供应商)调用方法时实现了大部分速度提升。 JIT编译器会编译整个方法而不是逐行解释它,这也可以提高运行启用JIT的应用程序的性能。这意味着如果代码只被调用一次,您将看不到显著的性能提升。 JIT编译器还忽略类构造函数,因此如果可能,请将构造函数代码最小化。JIT编译器是随Java 1.1一起提供的外部即时编译器。该术语现在已经过时。Java现在配备了一个内置编译功能的“HotSpot”JVM。