G1收集器通过停顿预测模型、Region分区和回收价值优先三者协同实现可预测停顿。它将堆划分为大小相等的Region,按需选取高性价比Region组成回收集,并依赖Remembered Set保障准确性,参数配置需匹配业务场景以维持模型稳定。

G1 收集器通过“停顿预测模型 + Region 分区 + 回收价值优先”三者协同,实现可预测的停顿时间。它不靠固定策略硬性截断,而是基于运行时数据动态决策,让每次 GC 尽量落在用户设定的目标窗口内。
Region 划分是可控停顿的基础
G1 把堆拆成多个大小相等(1–32MB,2的幂)、物理独立的 Region。回收不再以“整个新生代”或“整个老年代”为单位,而是按需挑选若干 Region 组成回收集(CSet)。单次回收范围可大可小,天然规避了传统收集器因扫描范围过大导致停顿不可控的问题。
- 每个 Region 可动态扮演 Eden、Survivor 或 Old 角色,无需连续内存空间
- 大对象(>0.5×RegionSize)直接分配到 Humongous Region,避免复制开销
- Region 数量越多,G1 调度越精细,但过小会增加元数据开销(如 Remembered Set)
停顿预测模型依赖衰减均值统计
G1 维护一组历史 GC 时间与回收收益(空间/耗时比)的衰减均值。新一次 GC 前,它根据 -XX:MaxGCPauseMillis 目标,反推本次最多能花多少时间,并据此估算可处理多少 Region——最近的 GC 数据权重更高,能更快响应突变(如缓存击穿、批量导入)。
- 该模型不是精确计算,而是概率性预估;P95 停顿时间接近设定值才算达标
- 若实际停顿频繁超限,说明模型被干扰(如堆浮动、对象存活率骤升、CPU 资源争抢)
- 日志中 “Pause” 字段的分布和波动,是验证模型是否收敛的关键依据
回收价值排序决定 Region 选取顺序
G1 不按分代顺序清理,而是给每个 Region 打分:分数 = 预期回收空间 ÷ 预估耗时。每次 GC 按分数从高到低取 Region,直到预算时间用尽。这就是“Garbage-First”的本质——优先清理“性价比最高”的垃圾区域。
- 年轻代 Region 通常垃圾多、复制快,得分高,常被优先选入 CSet
- 老年代 Region 若已大量死亡(如缓存批量失效),也会因高收益被提前混入 Mixed GC
- Remembered Set(RSet)保障跨 Region 引用扫描准确,避免漏标,是价值模型可信的前提
参数与配置直接影响模型效果
-XX:MaxGCPauseMillis 是软目标,生效前提是配套合理。脱离上下文单独调低该值,反而易引发 GC 频繁、吞吐下降甚至退化为 Full GC。
- 必须启用 -XX:+UseG1GC,否则参数无效
- 堆大小建议固定(-Xms = -Xmx),浮动堆会扰乱预测模型的稳定性
- 业务场景决定合理值:金融类设 50–100ms,Web API 设 200–300ms,批处理可放宽
- 配合 GC 日志(如 -Xlog:gc*,gc+heap=debug)和 gcviewer 工具,观察 Pause 分布与 CSet 构成

















