ParNew 收集器
ParNew 是 Serial 的多线程版本,它使用多个线程并行进行新生代垃圾收集。从名字就可以看出:「Par」是 Parallel(并行)的缩写,「New」表示它只作用于新生代。
ParNew 在多核环境下比 Serial 有更好的表现,是 CMS 收集器在新生代的默认搭档。
与 Serial 的区别
ParNew 与 Serial 的核心区别在于并行执行:
工作原理
ParNew 的工作原理与 Serial 类似,但使用多个线程并行执行:
- Stop The World:暂停所有应用线程
- 并行标记:多个 GC 线程从 GC Roots 出发,并行标记存活对象
- 并行复制:将存活对象复制到 Survivor 区
- 并行清理:清理 Eden 区和原 Survivor 区
- 恢复:恢复所有应用线程
与 CMS 的配合
ParNew 是 CMS 收集器在新生代的默认收集器。CMS(Concurrent Mark Sweep)是一个并发老年代收集器,它需要与一个新生代收集器配合工作。
配合工作流程:
- Minor GC:ParNew 负责新生代垃圾收集
- Old GC:CMS 负责老年代垃圾收集(并发执行)
- 降级:如果 CMS 老年代空间不足,退化为 Serial Old
配置参数
性能特点
停顿时间
在多核环境下,ParNew 的 STW 时间通常比 Serial 短。但需要注意的是,GC 线程数不是越多越好:
- 线程创建开销:每个 GC 线程都有创建和销毁开销
- 同步开销:多个线程需要同步共享状态
- 缓存竞争:大量线程可能竞争 CPU 缓存
当 GC 线程数超过一定数量后,收益递减,甚至可能因为开销增加而性能下降。
吞吐量
ParNew 的吞吐量通常比 Serial 高,但比 Parallel Scavenge 低:
适用场景
ParNew 适合以下场景:
- 与 CMS 配合:老年代使用 CMS,新生代自然选择 ParNew
- 低延迟需求:应用对停顿时间敏感
- 多核环境:4 核以上 CPU
- 中小内存:堆内存
1GB~4GB
在 Java 9 之后,ParNew 被标记为废弃,因为 G1 收集器逐渐成为 CMS 的替代方案。但在 Java 8 及之前,ParNew + CMS 仍然是低延迟场景的主流选择。