-XX:-TieredCompilation 究竟做了什么?

新手上路,请多包涵

使用 java -XX:+PrintFlagsFinal 我找到了 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,或者根本不编译?

原文由 Markus Weninger 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 785
2 个回答

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

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

  • 编译器线程会更少;
  • 将选择简单的编译策略(基于方法调用和后台计数器)而不是 高级编译策略
  • 默认保留的代码缓存大小将 小 5 倍

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

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

原文由 apangin 发布,翻译遵循 CC BY-SA 3.0 许可协议

正如您所注意到的(包括根本不运行 JIT),有不同级别的 JIT。

在旧版本的 Java 中,您过去必须首先选择它们(例如 -Xint-client-server ,只需使用 run- 解释器)客户端 (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 位 VM,那么它将使用服务器 VM (C2),否则它将使用客户端 VM (C1)。

所以 -Xint 将仅与解释器一起运行(即没有编译器),您可以分别选择 C1 或 C2 -client-server -XX:-TieredCompilation

原文由 AlBlue 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题