跳转到主内容
极星编程网:以代码为星,赴技术山海!

G1 预测模型:探讨 G1 是如何根据历史 GC 数据(Decaying Average)实时计算每个 Region 的预期回收收益

G1停顿预测模型基于衰减均值动态加权历史GC数据,新均值=α×当前观测值+(1−α)×旧均值(α通常0.7–0.95);回收收益为可回收空间÷预期耗时,按此排序选择Region构成CSet以逼近MaxGCPauseMillis目标。

G1 的停顿预测模型不是靠静态规则,而是靠持续观察和动态加权——它用衰减均值(Decaying Average)把历史 GC 行为“翻译”成对下一次回收的精准预估。核心不是记住所有数据,而是让最近的表现说了算。

衰减均值怎么算?不是简单平均G1 对每个 Region 的回收耗时、扫描对象数、复制数据量等关键指标,都维护一个衰减均值。公式本质是:新均值 = α × 当前观测值 + (1 − α) × 旧均值其中 α 是衰减因子(通常取 0.7–0.95),数值越大,越看重最新一次实测结果;越小,则历史数据影响越持久。比如某 Region 上次回收花了 8ms,之前均值是 6ms,α=0.8,那新均值就是 0.8×8 + 0.2×6 = 7.6ms。它天然淡化了上周那次异常慢的 20ms 回收,避免被偶然抖动带偏。

回收收益不是只看“能清多少”,而是看“性价比”

单个 Region 的预期回收收益(Value)由两部分共同决定:可回收空间(Reclaimed Memory)

:Region 总大小减去当前存活对象大小,这个值来自并发标记阶段的精确统计预期回收耗时(Predicted Cost)

:不是固定值,而是基于该 Region 历史扫描/复制时间的衰减均值,并结合当前存活对象分布密度做微调最终排序用的 Value ≈ 可回收空间 ÷ 预期耗时。所以一个“垃圾多但对象散乱”的 Region,可能比一个“垃圾略少但对象高度集中、复制极快”的 Region 排名更低——G1 要的是单位时间换来的最大空间释放。

预测模型如何落地到混合 GC 的决策中在混合 GC 触发前,G1 已经完成并发标记,拿到了所有老年代 Region 的存活数据。此时它会:遍历每个待评估的老年代 Region,查出它的历史衰减均值(耗时、扫描量等)

结合本次标记得到的存活大小,算出本次可回收空间代入公式得出预期收益分,并按分从高到低排序按 MaxGCPauseMillis 目标,从顶部开始累加 Region,直到预计总耗时逼近目标上限——这些 Region 就组成本次的 Collection Set(CSet)

整个过程不依赖人工调参,也不假设堆行为恒定。用户只设一个停顿目标,G1 就自动用衰减均值滚动校准,让每次混合 GC 都尽可能贴近承诺的毫秒级响应。

相关文章