Parallel Scavenge 与 Parallel Old
Parallel Scavenge(也称为 Throughput Collector)是 Parallel 公司的多线程新生代收集器,专注于高吞吐量场景。与关注停顿时间的 ParNew 不同,Parallel Scavenge 的目标是最大化应用运行时间与总时间的比例。
Parallel Old 是 Parallel Scavenge 的老年代搭档,使用标记-整理算法。
吞吐量优先
Parallel Scavenge 的核心设计目标是吞吐量。吞吐量(Throughput)定义为:
高吞吐量意味着 GC 时间占比小,应用能更充分地利用 CPU 资源。这对于后台批处理、科学计算等场景尤为重要。
与 ParNew 的区别
虽然 Parallel Scavenge 和 ParNew 都是多线程新生代收集器,但设计目标不同:
核心参数
吞吐量参数
GC 线程数参数
自适应调节机制
Parallel Scavenge 最有价值的功能是自适应调节。当启用 -XX:+UseAdaptiveSizePolicy 后,JVM 会根据运行情况自动调整以下参数:
- 新生代大小:根据 Minor GC 频率和存活对象数量动态调整
- Eden/Survivor 比例:根据对象晋升情况动态调整
- 晋升年龄:根据 Survivor 区使用情况动态调整
自适应调节的判断逻辑:
Parallel Old
Parallel Old 是 Parallel Scavenge 的老年代版本,使用标记-整理算法。
Parallel Old 的引入解决了 Parallel Scavenge 长期以来的短板:在没有 Parallel Old 之前,Parallel Scavenge 只能与 Serial Old 配合,而 Serial Old 是单线程的,会成为性能瓶颈。
配置示例
适用场景
批处理任务
批处理任务通常有明确的任务边界,不需要持续的低延迟响应:
科学计算
科学计算应用通常运行时间长,吞吐量是核心指标:
后台服务
后台数据处理、ETL、日志分析等场景:
吞吐量对比
Parallel Scavenge + Parallel Old 是吞吐量最高的组合,是后台批处理场景的首选。