Java虚拟机(JVM)编译级别

Java虚拟机(JVM)编译级别

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有两个版本 - 32b64b。C2只有64b。

分层编译

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

  • 编译器(-Xint)
  • C1(-client)
  • C2(-server)

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

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