Java 虚拟机 - 编译级别


JVM 支持五个编译级别 -

  • 口译员
  • 全面优化的 C1(无分析)
  • 具有调用和后沿计数器的 C1(轻型分析)
  • C1 具有完整的分析
  • C2(使用前面步骤中的分析数据)

如果您想禁用所有 JIT 编译器并仅使用解释器,请使用 -Xint。

客户端与服务器 JIT

使用 -client 和 -server 激活各自的模式。

客户端编译器 (C1) 比服务器编译器 (C2) 更早开始编译代码。因此,当 C2 开始编译时,C1 已经编译了代码段。

但在等待期间,C2 会分析代码,比 C1 更了解代码。因此,如果优化抵消了它等待的时间,则可以用来生成更快的二进制文件。从用户的角度来看,需要在程序的启动时间和程序运行所需的时间之间进行权衡。如果启动时间很重要,则应使用 C1。如果应用程序预计运行很长时间(通常是部署在服务器上的应用程序),最好使用 C2,因为它生成更快的代码,从而大大抵消任何额外的启动时间。

对于 IDE(NetBeans、Eclipse)和其他 GUI 程序等程序,启动时间至关重要。NetBeans 可能需要一分钟或更长时间才能启动。当 NetBeans 等程序启动时,会编译数百个类。在这种情况下,C1编译器是最好的选择。

请注意,C1 - 32b 和 64b有两个版本。C2 仅出现在64b中。

分层编译

在 Java 的旧版本中,用户可以选择以下选项之一 -

  • 口译员 (-Xint)
  • C1(-客户端)
  • C2(-服务器)

它来自 Java 7。它使用 C1 编译器启动,随着代码变得越来越热,切换到 C2。可以使用以下 JVM 选项激活它:-XX:+TieredCompilation。默认值在 Java 7 中设置为 false ,在 Java 8 中设置为 true

在五层编译中,分层编译使用1 -> 4 -> 5