parnew是serial收集器的多线程并行版本,专用于年轻代回收,通过多线程复制算法执行minor gc并stw,需与cms配合实现老年代并发回收;jdk9起被整合进cms且参数-xx:+useparnewgc已废弃。

ParNew 是 JVM 中专为年轻代设计的并行垃圾收集器,它本身不负责老年代回收,但能与 CMS(Concurrent Mark-Sweep)收集器协同工作,形成“ParNew + CMS”的经典组合,实现年轻代多线程回收 + 老年代并发回收的混合策略。
ParNew 如何触发并执行多线程年轻代回收
当 Eden 区空间不足、无法分配新对象时,JVM 触发 Minor GC。此时若启用 ParNew(通过 -XX:+UseParNewGC 或默认开启 CMS 时自动启用),它会:
- 使用固定数量的工作线程(默认等于 CPU 核心数,可通过 -XX:ParallelGCThreads=N 调整)并行复制存活对象
- 将 Eden 和 From Survivor 中仍存活的对象,复制到 To Survivor;部分高龄或大对象直接晋升至老年代
- 整个过程 STW(Stop-The-World),但因并行处理,停顿时间显著短于单线程的 Serial 收集器
CMS 如何与 ParNew 协同工作
CMS 专注老年代,不干预年轻代回收逻辑。它的配合体现在运行机制和参数联动上:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ParNew 是 CMS 的“默认搭档”:启用 -XX:+UseConcMarkSweepGC 时,JVM 自动启用 ParNew(无需显式加
-XX:+UseParNewGC) - CMS 不参与 Minor GC,但会在老年代剩余空间低于阈值(由 -XX:CMSInitiatingOccupancyFraction 控制)时启动并发标记,避免 ParNew 晋升导致老年代瞬间填满而触发 Full GC
- 两者共享 GC 日志格式(如
-XX:+PrintGCDetails中的ParNew和CMS标识),便于区分各阶段行为
关键配置与注意事项
要稳定发挥 ParNew + CMS 效能,需注意以下实践要点:
-
线程数匹配硬件:避免
-XX:ParallelGCThreads设置过大(如远超物理核数),否则线程竞争反而降低吞吐 - Survivor 空间调优:ParNew 依赖 Survivor 区做对象年龄跟踪,过小会导致提前晋升,加重 CMS 压力;可用 -XX:SurvivorRatio 调整比例
-
避免 CMS 失败:若 CMS 并发周期未完成,老年代就满,会退化为 Serial Old 进行 Full GC——此时 ParNew 的低延迟优势完全失效,需监控
concurrent mode failure日志 - JDK 9+ 已弃用:CMS 在 JDK 9 中被标记为废弃,JDK 14 正式移除;新项目应迁移到 G1 或 ZGC
这种组合本质是“分工明确”:ParNew 快速清理年轻代,CMS 尽量不中断应用地清理老年代。虽已淘汰,理解其协作逻辑对分析历史系统或掌握 GC 设计思想仍有价值。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










