使用java -XX:+PrintFlagsFinal
,我找到了TieredCompilation
标志,并在网上读到了一些关于它的信息。
然而,当设置为false
时,我仍然不知道会发生什么。
我知道编译系统支持5个执行级别,基本上分为解释器、C1和C2:
两个问题:
(1)通过设置-XX:-TieredCompilation
,其中一些级别是否刚刚被禁用?如果是,是哪一个?
(2)是否有什么标志来决定是禁用C1还是C2,还是根本不编译?
发布于 2016-08-02 13:34:03
发布于 2016-08-02 13:13:15
正如您已经注意到的,JIT有不同的级别(包括根本不运行JIT )。
在早期版本的Java中,您必须首先选择它们(例如-Xint
、-client
、-server
),以便只使用解释器、只使用客户端(C1)编译器或服务器(C2)编译器运行。
随着Java 7的出现,分层编译意味着hotspot编译器可以无缝地在这些步骤之间进行转换。因此,在运行一定数量的代码之后,代码将使用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位VM,那么它将使用一个服务器VM (C2),否则它将使用客户机VM (C1)。
因此,-Xint
将只与解释器一起运行(即没有编译器),您可以分别选择C1或C2与-client
或-server
,以及-XX:-TieredCompilation
。
https://stackoverflow.com/questions/38721235
复制相似问题