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-32b和64b两个版本。C2仅出现在64b中。
    在32b机器上,只能安装32b版本的JVM。在64b机器上,用户可以在32b版本和64b版本之间进行选择。但是有一些细微差别会影响我们Java应用程序的性能。如果Java应用程序使用的内存少于4G,那么即使在64b机器上,我们也应使用32b JVM。这是因为在这种情况下,内存引用将仅为32b,并且处理这些引用将比处理64b地址开销低。在这种情况下,即使我们使用的是OOPS(普通对象指针),64b JVM的性能也会变差。使用OOPS,JVM可以在64b JVM中使用32b地址。但是,操作它们将比真正的32b引用慢,因为底层的本机引用仍将是64b。如果我们的应用程序要消耗4G以上的内存,则我们将不得不使用64b版本,因为32b引用只能处理不超过4G的内存。我们可以将两个版本安装在同一台计算机上,并可以使用PATH变量在两个版本之间进行切换。
  • 分层编译

    在Java的旧版本中,用户可以选择以下选项之一-
    • 口译员(-Xint)
    • C1( - 客户端)
    • C2( - 服务器)
    它来自Java7。它使用C1编译器启动,随着代码变热,切换到C2。可以使用以下JVM选项激活它: -XX:+TieredCompilation。在Java 7中,默认值设置为false;在Java 8中,默认值设置为true。
    在五个编译层中,分层编译使用1-> 4-> 5。