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

2022-09-02 01:36:35

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

打印 HotSpot 的标志显示以下带有 -XX:+分层编译的标志值。

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

对于客户端和服务器编译器而言,标志太多。这些标志控制哪些编译器?如果不是客户端和服务器,附加编译器的用途是什么?

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


答案 1

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 队列的长度动态调整。


答案 2

推荐