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/