22

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

打印 HotSpot 的标志使用 -XX:+TieredCompilation 显示以下标志值。

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

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

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

4

1 回答 1

25

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

于 2013-08-21T18:50:45.180 回答