g1停顿预测模型核心是衰减平均,公式为davg=(1−α)×当前值+α×旧davg(α默认0.7),并取max(davg+0.5×dsd, davg×confidence_factor)作为保守预测值,兼顾近期趋势与波动缓冲。

G1收集器的动态停顿预测模型核心是衰减平均(Decaying Average),它不是简单算术平均,而是让新数据对预测结果影响更大,从而更贴合当前运行状态。
衰减均值的递推公式
每次记录一个Region回收耗时(或记忆集扫描时间等指标)后,G1用如下公式更新衰减均值 _davg:
- _davg = (1 − α) × 当前值 + α × 上一次_davg
- 其中 α 是历史权重系数,默认为 0.7
- 所以 (1 − α) = 0.3,即最新一次观测值占 30% 权重,历史均值占 70%
这个设计意味着:越近的数据贡献越大;一次异常长的回收时间不会立刻拉高预测值,但会缓慢抬升;连续多次变慢则预测值快速上移。
带置信度的预测值计算
仅靠衰减均值还不够稳健。G1实际使用的预测值(用于决定选哪些Region进回收集)是:
- 预测值 = MAX( davg + σ × dsd , davg × confidence_factor )
- davg:衰减均值
- dsd:衰减标准偏差(反映波动性)
- σ:可信度系数,默认为 0.5(对应 G1ConfidencePercent=50)
- confidence_factor:样本不足时的补偿系数。少于 5 次观测时大于 1,样本越多越趋近于 1
这相当于在“均值+风险缓冲”和“均值×可信放大”之间取较大者,兼顾稳定性与保守性。
为什么用衰减而非普通平均?
Java应用负载常随时间变化:流量高峰、缓存预热、对象生命周期迁移都会改变GC行为。普通平均会把一周前的低负载回收时间和平滑掉今天的高压力表现,导致预测偏乐观、超时风险上升。而衰减平均天然具备“遗忘旧状态”的能力,让模型始终锚定近期真实开销。
例如:某Region上周回收只花 5ms,本周因对象图变复杂涨到 18ms,连续三次后衰减均值会明显上移,促使G1降低对该Region的回收优先级或跳过它——这正是“价值收益最大化”的底层依据。
数据来源与截断机制
G1不保存全部历史,而是用 TruncatedSeq 结构只保留最近 N 个观测值(如回收耗时、脏卡数量)。每新增一项就丢弃最老一项,保证统计量始终反映近期趋势,也节省内存开销。这也是衰减模型能轻量、实时运行的关键支撑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











