g1 的 remark 阶段 stw 时间通常比 cms 更短、更可控,因其采用 satb 写屏障、多线程处理 satb 日志,并将开销前置分散;cms 则依赖增量更新且需全堆扫描,导致 remark 时间波动大、易受堆大小和活跃度影响。

G1 的 Remark 阶段 STW 时间通常比 CMS 更短、更可控,这是 G1 在设计上针对 CMS 的关键改进之一。
G1 的 Remark 优化机制更高效
G1 的重新标记阶段虽仍需 STW,但通过多项技术大幅压缩停顿时间:
- 采用“初始快照”(SATB, Snapshot-At-The-Beginning)写屏障,在并发标记开始时记录所有对象图快照,后续仅追踪被修改的引用,避免全堆扫描;
- Remark 阶段主要处理 SATB 缓冲区中少量已变更的引用记录,而非像 CMS 那样遍历整个记忆集(Remembered Sets)或重扫全部老年代;
- 支持多线程并行处理 SATB 日志,且可与混合回收(Mixed GC)的准备逻辑协同,减少冗余工作。
CMS 的 Remark 阶段易受堆大小和活跃度影响
CMS 的重新标记必须修正并发标记期间所有因用户线程导致的漏标,其 STW 时长波动较大:
- 依赖增量更新(Incremental Update)算法,需扫描被修改引用的对象及其子图,若业务存在高频对象图变更(如大量短生命周期集合、频繁 setter 调用),扫描范围会显著扩大;
- 无区域划分,需遍历整个老年代的卡表(Card Table)及部分新生代引用,堆越大、跨代引用越多,耗时越长;
- 在高负载场景下,Remark 可能成为 CMS 最长的 STW 环节,甚至接近 Full GC 水平,失去低延迟意义。
实际表现差异明显
在同等堆大小(如 8GB–16GB)和相似业务压力下:
- CMS 的 Remark 常见 STW 在 50–200ms,极端情况可达 300ms+;
- G1 的 Remark 多数控制在 10–50ms 内,且可通过
-XX:MaxGCPauseMillis参数引导 JVM 主动调整并发标记节奏,进一步压制峰值停顿。
根本原因在于设计哲学不同
CMS 追求“尽可能并发”,把复杂性推到 Remark 阶段来保证标记准确性;而 G1 将开销前置并分散——用 SATB 写屏障承担大部分标记一致性成本,使 Remark 成为轻量收尾。这不是单纯参数调优的结果,而是区域化 + 增量式标记模型带来的结构性优势。











