正如您已经注意到的,有不同级别的JIT(包括根本不运行JIT)。
在旧版本的Java,你曾经有过在第一选择它们(如-Xint
,-client
,-server
)与刚解释器中运行,只有在客户端(C1)的编译器,或者只是服务器(C2)编译器。
与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)
的-XX:-TieredCompilation
基本上是TieredCompilation=false
这意味着不这样做过渡看到不同的水平,你必须选择前面是否使用客户端或服务器编译器。 JVM启发式地决定根据您的CPU应用哪种模式;如果您有多个处理器或64位虚拟机,那么它将使用服务器虚拟机(C2),否则它将使用客户机虚拟机(C1)。
所以-Xint
将与刚刚解释器运行(即无编译器)并且可以选择只C1或C2分别与-client
或-server
,与-XX:-TieredCompilation
谢谢!现在我有点困惑,因为我有不同的答案:现在将设置-XX:-TieredCompilation(1.)禁用C1并始终编译为最大(C2)或(2.),让JVM试探性地决定哪些编译层禁用基于CPU(如@AlBlue所述)? 这也使我很难决定,哪一个接受为正确答案:P –
@MarkusWeninger我在AlBlue的回答下评论过。这不是很准确。 – apangin
谢谢,我刚刚看到它。在第二条评论中,您提到了'TierXCompileThreshold'和'-XX:CompilationPolicyChoice = 2',这两个新东西我仍然不知道,但我会阅读它们。 :P但是第一条评论很好地解释了我的问题。 –