2016-08-02 35 views
24

使用java -XX:+PrintFlagsFinal我找到了TieredCompilation标志,我在网上看了一下。-XX:-TieredCompilation做了什么?

但是,我仍然不知道究竟是将其设置为false时会发生什么情况。

我知道编译系统支持5倍执行的水平,基本上分裂成解释,C1和C2:

  • 水平0 - 解释
  • 级别1 - C1全部优化的(没有分析)
  • 级别2 - C1与调用和回边计数器
  • 级别3 - C1全分析(电平2 + MDO)
  • 级别4 - C2

来源:http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/2b2511bd3cc8/src/share/vm/runtime/advancedThresholdPolicy.hpp#l34

两个问题:

(1)通过设置-XX:-TieredCompilation,有一些这个级别的只是禁用?如果是,哪个?

(2)是否有一些标志来决定是否禁用C1或C2,或根本不编译?

回答

24

-XX:-TieredCompilation沿禁用中间汇编层(1,2, 3),以便在最大优化级别(C2)解释或编译方法。

作为副作用TieredCompilation标志还会更改编译器线程数,编译策略和默认代码高速缓存大小。请注意,TieredCompilation已禁用

要禁用C2编译器并只保留C1而没有额外开销,请设置-XX:TieredStopAtLevel=1

要禁用所有JIT编译器并在解释器中运行所有内容,请使用-Xint

+0

谢谢!现在我有点困惑,因为我有不同的答案:现在将设置-XX:-TieredCompilation(1.)禁用C1并始终编译为最大(C2)或(2.),让JVM试探性地决定哪些编译层禁用基于CPU(如@AlBlue所述)? 这也使我很难决定,哪一个接受为正确答案:P –

+0

@MarkusWeninger我在AlBlue的回答下评论过。这不是很准确。 – apangin

+0

谢谢,我刚刚看到它。在第二条评论中,您提到了'TierXCompileThreshold'和'-XX:CompilationPolicyChoice = 2',这两个新东西我仍然不知道,但我会阅读它们。 :P但是第一条评论很好地解释了我的问题。 –

10

正如您已经注意到的,有不同级别的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

+1

谢谢,'-Xint','-client'和'-server'是我一直在寻找的标志。 –

+1

我在https://speakerdeck.com/alblue/hotspot-under-the-hood上谈了一下编译级别,如果你想深入兔子洞:) – AlBlue

+0

谢谢,我会看看它! :) –