正如你所注意到的,有不同级别的JIT(包括根本不运行JIT)。
在较旧版本的Java中,您过去必须首先选择它们(例如,,)才能仅使用解释器运行,仅使用客户端(C1)编译器或仅使用服务器(C2)编译器运行。-Xint
-client
-server
Java 7附带的分层编译意味着热点编译器可以在这些步骤之间无缝切换。所以发生的事情是,经过一定量的运行后,代码将使用C1编译,然后在更多运行之后,它将使用C2进行编译。这是逐个方法的,所以当一个应用程序运行时,很大一部分将只是在解释器(用于冷代码)下运行,然后在代码运行很多(热)之后,它将被编译为更高的性能。您可以通过运行来查看不同的级别
$ java -XX:+PrintFlagsFinal -version | grep CompileThreshold
intx Tier2CompileThreshold = 0
intx Tier3CompileThreshold = 2000
intx Tier4CompileThreshold = 15000
openjdk version "1.8.0_92"
OpenJDK Runtime Environment (Zulu 8.15.0.1-macosx) (build 1.8.0_92-b15)
OpenJDK 64-Bit Server VM (Zulu 8.15.0.1-macosx) (build 25.92-b15, mixed mode)
本质上意味着不要执行此转换,并且您必须预先选择是使用客户端还是服务器编译器。JVM根据您的CPU启发式决定应用哪种模式;如果您有多个处理器或 64 位 VM,则它将使用服务器 VM (C2),否则它将使用客户端 VM (C1)。-XX:-TieredCompilation
TieredCompilation=false
因此,将仅使用解释器(即没有编译器)运行,您可以仅选择C1或C2,并分别使用或-Xint
-client
-server
-XX:-TieredCompilation