java - CompileThreshold、Tier2CompileThreshold、Tier3CompileThreshold 和 Tier4CompileThreshold 控制什么?

标签 java jit jvm-hotspot compiler-flags

HotSpot 的 tiered compilation使用解释器,直到调用(对于方法)或迭代(对于循环)的阈值触发具有 self 分析的客户端编译。使用客户端编译,直到另一个调用或迭代阈值触发服务器编译。

Printing HotSpot's flags使用 -XX:+TieredCompilation 显示以下标志值。

intx CompileThreshold      = 10000 {pd product}        
intx Tier2CompileThreshold = 0     {product}           
intx Tier3CompileThreshold = 2000  {product}           
intx Tier4CompileThreshold = 15000 {product}           

客户端和服务器编译器的标志太多了。这些标志控制哪些编译器?如果不是客户端和服务器,额外编译器的目的是什么?

在这种情况下是否忽略了 CompileThreshold 和 Tier2CompileThreshold?触发客户端编译时,Tier3CompileThreshold 控制什么?触发服务器编译时,Tier4CompileThreshold 控制什么?

最佳答案

advancedThresholdPolicy.hpp中的评论讨论不同的编译器层和阈值。请参阅该文件以进行更深入的讨论。

系统支持5个执行级别:

  • 第 0 级 - 口译员
  • 第 1 层 - 完全优化的 C1(无分析)
  • 第 2 层 - 具有调用和后台计数器的 C1
  • 第 3 层 - C1,具有完整分析(2 级 + MDO)
  • 4 级 - C2

C1 是客户端编译器。 C2 是服务器编译器。

在常见情况下,编译过程为:0 → 3 → 4。非典型情况根据 C1 和 C2 队列长度使用。当 C2 队列长度太长时使用第 2 层,以便该方法可以执行大约 30% 的速度,直到 C2 可以处理分析信息。如果确定该方法是微不足道的,那么它将使用第 1 层进行编译,因为它将生成与第 4 层相同的代码。

阈值根据 C1 和 C2 队列的长度动态调整。

关于java - CompileThreshold、Tier2CompileThreshold、Tier3CompileThreshold 和 Tier4CompileThreshold 控制什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18345089/

相关文章:

java - 避免需要设置 jmxremote 端口(以远程使用 VisualVM)?

java jbox2d swing 绘制和移动形状

java - 有没有办法提取哪个 JPanel 被单击?

java - 如何模拟JIT优化来查看优化后的字节码?

c++ - D 是否适合编写跟踪 JIT 编译器?

java - 由于 ReadVirtual 失败,无法创建堆转储

java - 如果java可以编译代码,为什么还要解释它?

java - 在 Java 中使用指定的开始和结束索引查找数组中的最大整数,**递归**

java - 在 Java 中创建时间戳的正确方法是什么?

java - 来自 Wiki 的困惑 : C# and Java are interpreted?