JVM支持五种编译级别 -
如果要禁用所有JIT编译器并仅使用解释器,请使用-Xint
。
使用-client
和-server
激活相应的模式。
客户端编译器(C1)比服务器编译器(C2)更早地开始编译代码。因此,在C2开始编译时,C1已经编译了代码段。
但是当它等待时,C2会对代码进行分析,以便比C1更了解它。因此,如果优化的偏移可以用于生成更快的二进制文件,它等待的时间。从用户的角度来看,权衡是在程序的启动时间和程序运行所花费的时间之间。如果启动时间需要更多,则应使用C1。如果应用程序预计会运行很长时间(典型的是部署在服务器上的应用程序),最好使用C2,因为它会生成更快的代码,从而大大抵消任何额外的启动时间。
对于IDE(NetBeans,Eclipse)和其他GUI程序等程序,启动时间至关重要。NetBeans可能需要一分钟或更长时间才能启动。在启动NetBeans等程序时会编译几百个类。在这种情况下,C1编译器是最佳选择。
请注意,C1有两个版本 - 32b
和64b
。C2只有64b。
在Java的旧版本中,用户可以选择以下选项之一 -
它来自Java 7。它使用C1编译器启动,随着代码变得更热,切换到C2。可以使用以下JVM选项激活它:-XX:+ TieredCompilation
。Java 7中的默认值设置为false
,Java 8中的默认值设置为true
。
在五层编译中,分层编译使用:1 -> 4 -> 5
。