parnew 是 jdk 8 及以前用于新生代的并行收集器,需配合 cms 使用,jdk 9 起废弃、jdk 14 彻底移除;现推荐 g1、zgc 或 shenandoah 等现代收集器。

Java 新生代使用 ParNew 收集器,需通过 JVM 启动参数显式指定,且它通常与老年代的 CMS 或 G1(早期版本)配合使用。注意:从 JDK 9 开始,ParNew 已被标记为废弃;JDK 14 起彻底移除,不再支持。
启用 ParNew 的基本参数
要让新生代使用 ParNew,必须关闭默认的并行收集器(如 UseParallelGC),并启用 ParNew 和对应的旧生代收集器:
- -XX:+UseParNewGC:启用 ParNew 作为新生代收集器(JDK 8 及之前有效)
- -XX:+UseConcMarkSweepGC:搭配使用 CMS(CMS 默认要求新生代用 ParNew)
- 不能同时启用 -XX:+UseParallelGC 或 -XX:+UseG1GC,否则会冲突报错
常见组合与限制
ParNew 不是独立工作的收集器,它必须和特定老年代收集器协同:
- CMS(Concurrent Mark Sweep)是 ParNew 的“原配”:JDK 7/8 中
-XX:+UseConcMarkSweepGC会自动启用 ParNew,无需额外写UseParNewGC - G1 在 JDK 7u4 之后逐步取代 CMS+ParNew 组合;G1 自身管理整个堆,不区分新生代用哪个“子收集器”,所以
UseParNewGC对 G1 无效 - Parallel GC(吞吐量优先)使用的是
Parallel Scavenge(即 -XX:+UseParallelGC),不是 ParNew,二者不可混用
调优相关参数(JDK 8 及以前)
若仍在维护老版本应用,可结合以下参数控制 ParNew 行为:
- -XX:ParallelGCThreads=N:设置 ParNew 使用的线程数(默认等于 CPU 核心数)
- -XX:MaxTenuringThreshold=N:控制对象晋升老年代前在新生代经历的 GC 次数
- -Xmn 或 -XX:NewRatio:设定新生代大小,影响 ParNew 触发频率
-
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps:观察日志中是否出现
ParNew字样(如ParNew (promotion failed))
现代替代方案(JDK 9+ 推荐)
ParNew 已淘汰,当前应转向更稳定、统一的收集器:
-
G1 GC(
-XX:+UseG1GC):默认分代,自动适配新生代回收,兼顾停顿与吞吐 - ZGC(JDK 11+)或 Shenandoah(JDK 12+):低延迟、全堆并发,无传统新生代/老年代强绑定
- 如仍需高吞吐,可用 Parallel GC(
-XX:+UseParallelGC),其新生代使用 Parallel Scavenge,性能通常优于 ParNew
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











