并行、并发与增量是现代GC协同降低STW的三大支柱:并行通过多线程压缩单次停顿时间;并发让GC与用户线程错峰运行,减少冻结次数;增量将大任务切片穿插执行,提升响应平滑性。

理解并行、并发与增量技术的关键,在于看清它们各自解决 STW 的不同切口:并行压缩时间,并发转移工作线程,增量则把大动作“呼吸化”。三者不是互斥选项,而是现代 GC(如 G1、ZGC)协同运作的底层支柱。
并行:多线程抢在 STW 里干完活
并行指多个 GC 线程在一次 STW 过程中同时执行任务,比如并行标记、并行复制或并行清理。它不减少 STW 的次数,但显著缩短单次停顿时长。
- 适用于所有需要安全一致状态的操作,例如年轻代的 Evacuation Pause(G1 中的疏散暂停)或 Serial/Parallel GC 的整个回收周期
- 效果取决于 CPU 核心数:4 核机器上并行标记比单线程快近 4 倍(忽略同步开销)
- 注意:并行本身仍属 STW 范畴——用户线程全程挂起,只是 GC 干得更快了
并发:让 GC 和业务线程“错峰共存”
并发是指 GC 线程与用户线程在同一时间段内交替或重叠运行。它把原本必须 STW 完成的阶段(如标记、清理),拆成可穿插执行的小单元,大幅削减真正冻结应用的时间点。
- G1 的并发标记阶段、CMS 的并发标记与并发清除,都属于典型并发行为
- 关键依赖写屏障(Write Barrier):当用户线程修改引用时,及时通知 GC 线程修正标记状态,防止漏标
- 并非完全无 STW:初始标记和最终标记仍需短暂暂停,但通常控制在 1ms 内
增量:把一次“深呼吸”变成多次“浅呼吸”
增量是时间维度上的调度策略,核心是把一个耗时长的 GC 子任务(尤其是标记)切成小片,每次只执行一小块,然后交还 CPU 给用户线程,形成“GC—业务—GC—业务”的节奏。
- V8 引擎和 G1 都采用增量式标记:每帧或每毫秒只扫描几十个对象,单次不超过 2ms
- 依赖三色抽象(白/灰/黑)维持中断-恢复一致性:灰色代表待处理,黑色代表已处理且子节点全扫完,白色代表未触及
- 代价是总 GC 时间略增(线程切换、状态保存),但换来更平滑的响应体验,特别适合动画、音视频等实时敏感场景
三者如何配合压低感知停顿
以 G1 为例:它用并发+增量完成标记(大部分时间无 STW),用并行完成最终的 Region 复制(STW 很短),再用并发做 Remembered Set 更新与清理。整个过程只有两次极短 STW(初始标记与重新标记),其余全是后台或穿插执行。
- CMS 更侧重并发,但放弃压缩导致碎片化;ZGC 则把对象移动、重映射也做成并发,STW 仅剩几微秒
- 选对回收器比调参数重要:G1 默认按 -XX:MaxGCPauseMillis=200ms 动态规划回收节奏,比硬设年轻代大小更有效
- 真正卡顿往往不在 GC 策略本身,而在突发大对象分配、跨代强引用滞留、或写屏障触发过于频繁

















