即时(JIT)编译器是Java™运行时环境的组件,可提高运行时Java应用程序的性能。
Java程序由类组成,这些类包含与平台无关的字节码,可以由JVM在许多不同的计算机体系结构上解释。在运行时,JVM加载类文件,确定每个单个字节码的语义,并执行适当的计算。解释过程中额外的处理器和内存使用情况意味着Java应用程序比本地应用程序执行得更慢。JIT编译器通过在运行时将字节码编译为本机机器代码来帮助提高Java程序的性能。
JIT编译器默认情况下处于启用状态,并在调用Java方法时被激活。JIT编译器将该方法的字节码编译为本地机器代码,“及时”编译以运行。编译方法后,JVM会直接调用该方法的已编译代码,而不是对其进行解释。从理论上讲,如果编译不需要处理器时间和内存使用量,则编译每种方法都可以使Java程序的速度接近本机应用程序的速度。
JIT编译确实需要处理器时间和内存使用率。JVM首次启动时,将调用数千种方法。即使程序最终达到了非常好的峰值性能,编译所有这些方法也会严重影响启动时间。
在实践中,方法不是在第一次调用时编译的。对于每种方法,JVM维护一个调用计数,每次调用该方法时,该计数都会增加。JVM解释一个方法,直到其调用计数超过JIT编译阈值为止。因此,经常使用的方法在JVM启动后立即进行编译,而较少使用的方法则在以后编译,或者根本不编译。JIT编译阈值可帮助JVM快速启动,并仍具有改进的性能。精心选择了阈值,以在启动时间和长期性能之间获得最佳平衡。
编译方法后,其调用计数将重置为零,并且对该方法的后续调用将继续增加其计数。当方法的调用计数达到JIT重新编译阈值时,JIT编译器将对其进行第二次编译,并使用比上一次编译更大的优化选择。重复此过程,直到达到最大优化级别。Java程序最繁忙的方法总是最积极地进行优化,从而最大程度地提高了使用JIT编译器的性能。JIT编译器还可以在运行时测量操作数据,并使用该数据来提高进一步重新编译的质量。
可以禁用JIT编译器,在这种情况下,将解释整个Java程序。除了诊断或解决JIT编译问题外,不建议禁用JIT编译器。
参考:
1.https://www.ibm.com/support/knowledgecenter/SSYKE2_7.1.0/com.ibm.java.aix.71.doc/diag/understanding/jit_overview.html
2.https://stackoverflow.com/questions/95635/what-does-a-just-in-time-jit-compiler-do
网友评论