Parallel Scavenge + Parallel Old 是 JDK 8 及之前默认的吞吐量优先 GC 组合,通过 -XX:+UseParallelGC 启用,配合 -XX:GCTimeRatio 和 -Xms/-Xmx 相等调优以最大化吞吐量,但不适用于低延迟场景且 JDK 15+ 已移除。

Parallel Scavenge + Parallel Old 是 JDK 8 及之前版本中默认的吞吐量优先垃圾收集器组合,目标是最大化应用程序的吞吐量(即 CPU 时间用于执行用户代码的比例),适合后台批处理、科学计算等对停顿时间不敏感但追求高吞吐的场景。
核心 JVM 参数配置
启用该组合只需指定新生代收集器,老年代会自动匹配 Parallel Old(JDK 8+ 默认行为):
- -XX:+UseParallelGC:启用 Parallel Scavenge(新生代) + Parallel Old(老年代)组合
-
-XX:MaxGCPauseMillis=
(可选):设置 GC 最大暂停时间目标(如 200),JVM 会动态调整堆大小和年轻代比例来逼近该目标——注意:这会以牺牲吞吐量为代价,开启后可能偏离“吞吐量优先”初衷 -
-XX:GCTimeRatio=
:直接控制吞吐量目标,推荐显式设置。例如 -XX:GCTimeRatio=99 表示允许 GC 占用 1/(1+99) = 1% 的总时间,即吞吐量目标为 99% - -XX:+UseAdaptiveSizePolicy(默认开启):让 JVM 自动调优年轻代大小、晋升阈值等,配合 GCTimeRatio 效果更佳
合理设置堆与年轻代大小
吞吐量优先不等于堆越大越好,过大的堆反而延长 Full GC 时间、降低响应灵活性:
- 用 -Xms 和 -Xmx 设置相等的初始与最大堆大小(如 -Xms4g -Xmx4g),避免运行时扩容带来的额外开销
- 通过 -XX:NewRatio=
控制新老年代比例(默认 NewRatio=2,即年轻代占堆 1/3)。若对象生命周期短、分配率高,可适当调小(如 -XX:NewRatio=1,年轻代占 1/2);反之则增大 - 也可用 -XX:SurvivorRatio 调整 Eden 与 Survivor 区比例(默认 8),减少 Survivor 空间争抢,利于快速回收短命对象
监控与验证是否生效
启动时添加以下参数确认收集器类型并观察吞吐表现:
- -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc.log:输出详细 GC 日志
- 查看日志开头是否有类似 Using Parallel 或 Parallel GC 字样,确认使用的是 Parallel Scavenge / Parallel Old
- 统计单位时间内 GC 总耗时占比:总 GC 时间 / (总 GC 时间 + 应用运行时间),应接近你设定的 1/(1 + GCTimeRatio)
- 避免频繁 Full GC:若 Parallel Old 触发过于频繁,说明老年代压力大,需检查内存泄漏、对象过早晋升或堆 sizing 不合理
注意事项与常见误区
该组合不适合低延迟敏感型应用(如实时交易、Web 交互),也需警惕配置冲突:
- 不要混用 -XX:+UseParallelGC 和 -XX:+UseConcMarkSweepGC 或 -XX:+UseG1GC,JVM 会报错退出
- JDK 9+ 默认改为 G1,如需继续使用 Parallel,必须显式指定 -XX:+UseParallelGC
- Parallel Old 在 JDK 14 被标记为 deprecated,JDK 15+ 已移除;如使用 JDK 15+,吞吐量优先推荐改用 G1 并配合 -XX:G1HeapRegionSize、-XX:MaxGCPauseMillis 等调优,或升级到 ZGC/Shenandoah(需权衡稳定性)

















