parnew 与 parallel old 不兼容,无法组合使用;parnew 只能搭配 serial old 或 cms,而 parallel old 是 parallel scavenge 的专属老年代收集器,正确高吞吐组合为 parallel scavenge + parallel old。

不能配置 ParNew 与 Parallel Old 组合——它们不兼容,无法一起使用。
ParNew 和 Parallel Old 不能搭配
ParNew 是为配合 CMS 或 Serial Old 设计的新生代收集器,而 Parallel Old 是 Parallel Scavenge 的专属搭档。HotSpot JVM 明确禁止 ParNew + Parallel Old 的组合,启动时会直接报错或自动降级(如回退到 ParNew + Serial Old)。
- GC 日志中若出现 ParNew,说明新生代用的是 ParNew;若出现 ParOldGen,说明老年代用的是 Parallel Old ——这两者不会同时出现在一次 GC 日志中
- JVM 参数互斥:启用
-XX:+UseParNewGC会禁用 Parallel Scavenge;启用-XX:+UseParallelOldGC会自动启用-XX:+UseParallelGC(即 Parallel Scavenge),并关闭 ParNew - 官方组合表明确列出:只有 Parallel Scavenge + Parallel Old 是吞吐量优先的合法组合;ParNew 只能配 CMS 或 Serial Old
真正实现高吞吐量的正确组合是 Parallel Scavenge + Parallel Old
这套组合专为后台批处理设计,通过参数直控吞吐目标,而非靠调优经验“猜”大小。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 启用方式:
-XX:+UseParallelGC -XX:+UseParallelOldGC(JDK 8+ 默认配套开启,显式声明更清晰) - 核心吞吐调控:
-XX:GCTimeRatio=99表示允许 GC 占总时间 ≤1%,剩余 99% 给业务代码 - 关闭动态干扰:
-Xms与-Xmx设为相等,避免运行时扩容触发 Full GC - 保持自适应策略开启(默认):
-XX:+UseAdaptiveSizePolicy,让 JVM 自动调年轻代大小、Survivor 比例和晋升阈值
为什么不用 -XX:MaxGCPauseMillis?
该参数会迫使 JVM 缩小年轻代来降低单次停顿,结果是 Minor GC 更频繁,总体 GC 时间上升,反而损害吞吐量。
- Parallel 系列的设计哲学是:接受稍长但更少的暂停,换取更高单位时间的有效计算
- 对定时报表、ETL、模型训练等后台任务,一次 200ms 的 STW 比每 5 秒一次 50ms 的 STW 更高效
- 除非明确要求响应毛刺低于某阈值(如 -XX:MaxGCPauseMillis
适用场景与堆规模建议
这套组合在中等堆容量下表现最优,过大或过小都会削弱优势。
- 推荐堆范围:4GB–12GB;超过 16GB 时,Parallel Old 的 Full GC 可能达秒级,延迟风险陡增
- 典型适用:夜间数据清洗、日终结算、离线特征生成、批量导出等无实时交互需求的任务
- 明显不适用:API 服务、Web 应用、实时风控系统——这些需要低延迟,应选 G1 或 ZGC
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










