parallel scavenge收集器的核心目标是追求高吞吐量,即最大化用户线程执行时间占总时间的比例,通过并行多线程回收、自适应调节策略和明确参数(如-xx:gctimeratio)实现;它接受较长但较少的stw,适合后台批处理、科学计算等cpu密集型场景,并默认与parallel old搭配使用。

是的,Parallel Scavenge收集器的核心设计目标就是追求高吞吐量,而不是低延迟。
吞吐量的定义与计算方式
吞吐量指应用程序运行时间占总时间(应用运行时间 + GC时间)的比例,公式为:
吞吐量 = 用户线程执行时间 / (用户线程执行时间 + GC时间) × 100%
例如:程序运行100分钟,其中GC耗时2分钟,吞吐量就是98%。Parallel Scavenge会主动权衡停顿时间与回收频率,优先保障这个比值最大化。
为吞吐量服务的关键机制
- 并行多线程回收:在STW期间启用多个GC线程并行工作,加快单次回收速度,减少单位任务的总GC开销
- 自适应调节策略(-XX:+UseAdaptiveSizePolicy):自动调整新生代大小、Eden/Survivor比例、对象晋升年龄等,动态逼近预设吞吐目标
- 参数导向明确:-XX:GCTimeRatio直接控制GC时间占比(如设为19,即允许最多5%时间用于GC),-XX:MaxGCPauseMillis虽可设,但仅作为辅助约束,调得太小反而拉低吞吐
与其他收集器的本质区别
和ParNew、CMS、G1不同,Parallel Scavenge不以“缩短单次停顿”为首要目标。它接受较长但次数更少的STW,换取更长的连续用户线程执行时间。这种取舍特别适合:
- 后台批处理系统(如日终结算、报表生成)
- 科学计算或ETL任务
- CPU密集型且无强交互要求的服务
典型搭配与默认行为
Parallel Scavenge通常与Parallel Old组合使用,构成完整的吞吐量优先分代回收方案:
- JDK 8及以后版本在Server模式下默认启用该组合
- -XX:+UseParallelGC会自动激活-XX:+UseParallelOldGC
- 老年代采用并行标记-整理算法,保持整体吞吐一致性











