概述

StackOverflow 文档

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

  • Java 程序由类组成,这些类包含可由 JVM 在许多不同计算机体系结构上解释的平台中立字节码。
  • 在运行时,JVM 加载类文件,确定每个字节码的语义,并执行适当的计算。

解释期间额外的处理器和内存使用意味着 Java 应用程序的执行速度比本机应用程序慢。

JIT 编译器通过在运行时将字节码编译为本机机器代码来帮助提高 Java 程序的性能。

默认情况下启用 JIT 编译器,并在调用 Java 方法时激活。JIT 编译器将该方法的字节码编译为本机机器代码,并将其编译为 just in time 以运行。

编译方法时,JVM 直接调用该方法的编译代码,而不是解释它。从理论上讲,如果编译不需要处理器时间和内存使用,编译每个方法可以使 Java 程序的速度接近本机应用程序的速度。

JIT 编译确实需要处理器时间和内存使用。当 JVM 首次启动时,会调用数千个方法。即使程序最终达到非常好的峰值性能,编译所有这些方法也会显着影响启动时间。

  • 实际上,方法在第一次调用时不会被编译。对于每个方法,JVM 都维护一个 call count,每次调用该方法时它都会递增。
  • JVM 解释方法,直到其调用计数超过 JIT 编译阈值。
  • 因此,经常使用的方法是在 JVM 启动后很快编译的,而较少使用的方法会在很晚之后编译,或者根本不编译。
  • JIT 编译阈值有助于 JVM 快速启动并且仍然具有改进的性能。
  • 已仔细选择阈值以在启动时间和长期性能之间获得最佳平衡。
  • 编译方法后,其调用计数将重置为零,并且对该方法的后续调用将继续增加其计数。
  • 当方法的调用计数达到 JIT 重新编译阈值时,JIT 编译器第二次编译它,应用比先前编译更多的优化选择。
  • 重复此过程,直到达到最大优化级别。

Java 程序中最繁忙的方法总是最积极地进行优化,从而最大限度地提高了使用 JIT 编译器的性能优势。

JIT 编译器还可以测量 operational data at run time,并使用该数据来提高进一步重新编译的质量。

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