Skip to content

Parallel GC

Parallel GC 是吞吐量优先的垃圾回收器。它使用多个 GC 线程并行回收,但回收期间应用线程通常暂停。它适合批处理、离线计算、后台任务等“总处理时间优先”的场景。

定位

维度说明
核心目标提高吞吐量
执行方式多线程并行 STW
适合场景批处理、报表、离线任务
不适合场景强交互、低延迟接口服务

吞吐量优先意味着:允许单次停顿相对更长,但希望应用总体花在业务计算上的时间更多。

工作方式

text
应用线程暂停 -> 多个 GC 线程并行复制 / 整理 -> 应用线程恢复

它能利用多核 CPU 缩短 GC 工作时间,但不能消除 STW。

启用

bash
-XX:+UseParallelGC

常见参数:

bash
-XX:ParallelGCThreads=8
-XX:MaxGCPauseMillis=500
-XX:GCTimeRatio=99

这些参数是目标和约束,不是绝对保证。设置停顿目标过低,可能牺牲吞吐或导致更频繁 GC。

适用判断

适合:

  • 离线批处理,用户不直接等待每个请求。
  • 更关心单位时间完成多少任务。
  • GC 停顿可被任务模型接受。

不适合:

  • API 延迟有严格 P99/P999 要求。
  • 暂停数百毫秒会明显影响用户体验。

排查

关注:

  • GC 时间占比。
  • Full GC 频率。
  • 单次暂停是否超过任务 SLA。
  • CPU 是否被 GC 线程打满。

命令:

bash
jstat -gcutil <pid> 1000
jcmd <pid> VM.flags

如果吞吐足够但停顿不可接受,考虑 G1、ZGC 或 Shenandoah。

别急,先让缓存热一下。