Just-In-Time (JIT) 编译器是 Java™ Runtime Environment 的一个组件,用于提高运行时的 Java 应用程序的性能。

Java 程序由多个类组成,它包含可在许多不同计算机体系结构上由 JVM 解释的与平台无关的字节码。在运行时,JVM 装入类文件,确定每个单独的字节码的语义,并执行相应的计算。解释期间额外使用处理器和内存意味着 Java 应用程序的执行速度要慢于本机应用程序。JIT 编译器通过在运行时将字节码编译为本机代码以帮助提高 Java 程序的性能。

JIT 编译器在缺省情况下为已启用,并在调用 Java 方法时被激活。JIT 编译器将该方法的字节码编译为本机机器码,“即时”编译该代码以便运行。在编译方法时,JVM 直接调用该方法的已编译代码,而不是对代码进行解释。理论上,如果编译不需要占用处理器时间和内存,那么编译每个方法都可能使 Java 程序速度接近于本机应用程序的速度。

JIT 编译不需要占用处理器时间和内存。在 JVM 首次启动时,将调用数千种方法。即使程序最终实现了较高的峰值性能,编译所有这些方法也会对启动时间产生显著影响。

实际上,第一次调用方法时不会对方法进行编译。 对于每个方法,JVM 都会保留一个调用计数,每次调用方法时该计数都将递增。JVM 对方法进行解释,直至其调用计数超过 JIT 编译阈值。因此,在 JVM 启动后将立即编译常用方法,而在较长时间之后(或者根本不编译)不常使用的方法。JIT 编译阈值帮助 JVM 快速启动并且还可提高性能。 谨慎选择阈值,以在启动时与长期性能之间实现最佳平衡。

在编译方法后,调用计数将重置为 0,并且对该方法的后续调用将继续使其计数递增。在方法的调用计数到达 JIT 重新编译阈值时,JIT 编译器将执行第二次编译,与前一次编译相比,其优化选择更多。此过程将重复,直至到达最大优化级别。Java 程序的最忙碌方法始终是最积极地进行优化,从而实现使用 JIT 编译器的性能优势最大化。JIT 编译器还可在运行时度量运作数据,并使用该数据来提高进一步重新编译的质量。

可禁用 JIT 编译器,在这种情况下,将解释整个 Java 程序。除诊断或解决 JIT 编译问题外,不推荐禁用 JIT 编译器。

from: https://www.ibm.com/support/knowledgecenter/zh/SSYKE2_7.0.0/com.ibm.java.lnx.70.doc/diag/understanding/jit_overview.html