您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

JVM如何决定JIT编译方法(将方法分类为“hot”)?

JVM如何决定JIT编译方法(将方法分类为“hot”)?

HotSpot编译策略相当复杂,尤其是对于分层编译而言,它在Java 8中是认启用的。它既不是执行次数,也不是CompileThreshold参数。

最佳解释(显然是唯一合理的解释)可以在HotSpot源中找到,请参阅advancedThresholdPolicy.hpp。

我将总结此高级编译策略的要点:

每次计数器达到一定的频率值(TierXInvokeNotifyFreqLog,TierXBackedgeNotifyFreqLog),编译政策被称为决定下一步与当前正在运行的方法做什么。取决于的值i,b而C1和C2的编译器线程的当前负载,可以决定

继续在解释器中执行;

最后在没有配置文件或计数器的第1层使用C1编译方法(也不可能)。 这里的关键参数是TierXInvocationThresholdTierXBackEdgeThreshold。可以根据编译队列的长度为给定方法动态调整阈值。

编译队列不是FIFO,而是优先级队列。

具有概要数据(第3层)的C1编译代码的行为类似,不同之处在于切换到下一个级别(C2,第4层)的阈值要大得多。例如,大约200次调用后,解释的方法可以在第3层进行编译,而经过5000次调用后,C1编译的方法将在第4层进行重新编译。

特殊策略用于方法内联。即使它们不是“热”的,它们也可以内联到调用方中。只有频繁调用()时InlineFrequencyRatio,才可以内联更大的方法InlineFrequencyCount

其他 2022/1/1 18:15:35 有662人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶