JIT 编译器

Just-In-Time (JIT) 编译器是运行时环境的一个组件,它通过在运行时将字节码编译为本机机器代码来提高 Java™ 应用程序的性能。

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

缺省情况下,启用 JIT 编译器。 在编译方法时,JVM 直接调用该方法的已编译代码,而不是对代码进行解释。 理论上,如果编译不需要处理器时间和内存使用,那么编译每个方法都可以允许 Java 程序的速度与本机应用程序的速度相匹配。

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

实际上,第一次调用方法时不会对方法进行编译。 对于每个方法,JVM 都会保留一个调用计数,以预定义的编译阈值开始,并在每次调用方法时递减。 当调用计数达到零时,将触发方法的即时编译。 因此,在 JVM 启动后将立即编译常用方法,而在较长时间之后(或者根本不编译)不常使用的方法。 JIT 编译阈值帮助 JVM 快速启动并且还可提高性能。 选择阈值以在启动时与长期性能之间实现最佳平衡。

JIT 编译器可以在不同的优化级别编译方法: coldwarmhotveryHotscorching (请参阅 -Xjit中的 optlevel )。 优化级别越高,预期的性能越高,但它们在 CPU 和内存方面的编译成本也较高。 方法的初始或缺省优化级别为 warm,但有时 JIT 启发式会使优化级别降级至 cold 以缩短启动时间。

可以通过不同的机制将方法重新编译为更高的优化级别。 其中一种机制是采样: JIT 编译器维护一个定期唤醒的专用采样线程,并确定哪些 Java 方法更频繁地出现在堆栈的顶部。 此类方法对于性能而言更为重要,它们是在 hotveryHotscorching 的更高级别进行重新优化的候选项。

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