📜  Java虚拟机-编译级别

📅  最后修改于: 2020-11-13 05:36:00             🧑  作者: Mango


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(服务器)

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

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