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

时间:2013-08-20 21:15:33

标签: java jit jvm-hotspot compiler-flags

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

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在触发服务器编译时控制什么?

1 个答案:

答案 0 :(得分:20)

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