parallel scavenge与parallel old是吞吐量优先的并行gc组合:前者用并行复制清理新生代,后者用并行标记-整理清理老年代;通过gctimeratio、自适应策略等参数调控吞吐,适用于批处理而非低延迟场景。

Parallel Scavenge 与 Parallel Old 是一套专为吞吐量优先设计的多线程垃圾收集组合,内核逻辑围绕“最大化用户代码执行时间占比”展开,不追求单次停顿短,而强调单位时间内 GC 总耗时尽可能少。
核心算法分工明确
Parallel Scavenge 负责新生代,采用并行标记-复制算法:多个线程同时扫描、复制存活对象到 Survivor 或老年代,回收后 Eden 区完全清空,无碎片;Parallel Old 负责老年代,采用并行标记-整理算法:先并发标记,再将存活对象向一端压缩,最后清理边界外空间——既避免内存碎片,又支持大对象连续分配。
吞吐量控制由参数直接驱动
吞吐量不是估算值,而是通过 JVM 内置反馈机制主动调控的目标:
一款AI视频创作工具,主要用于蛙蛙写作辅助AI写文,帮助获取创意灵感,提供拆书、小说转剧本、视频生成等功能,是一款功能全面的AI智能写作工具,适合需要提升相关任务效率的用户。
- -XX:GCTimeRatio=n:设定 GC 时间占总运行时间的上限比例为 1/(1+n),例如设为 99,即允许 GC 最多占用 1% 时间,其余 99% 交还给用户代码
- -XX:+UseAdaptiveSizePolicy(默认开启):JVM 根据 GC 日志中的暂停时长、晋升速率、回收效率等实时数据,自动调整年轻代大小、Survivor 比例、对象晋升年龄等,无需手动干预细节
- -XX:MaxGCPauseMillis 可设但慎用:它会强制 JVM 缩小年轻代来换取更短单次停顿,反而抬高 GC 频率,拉低整体吞吐——这与吞吐量优先目标相悖
堆结构与线程协同优化
该组合依赖稳定可控的堆行为才能发挥效能:
- -Xms 与 -Xmx 设为相等:避免运行时扩容触发额外 Full GC 或元空间调整,保障吞吐稳定性
- 年轻代比例可调但不宜极端:默认 -XX:NewRatio=2(年轻代占堆 1/3),若对象生命周期极短且分配快,可设为 1(占 1/2);过高则易导致老年代过早填满,触发 Parallel Old 频繁介入
- 所有 GC 阶段均为 Stop-The-World:包括 Minor GC 和 Major/Full GC,但因全程多线程并行执行,STW 时间在中等堆规模(4–8GB)下仍能保持相对可控
适用边界清晰,不可跨场景滥用
这套组合在 JDK 8 是默认,在 JDK 15+ 已被移除,其设计天然排斥低延迟诉求:
- 适合后台批处理、离线计算、定时报表生成等任务——它们可以接受秒级 Full GC,但不能容忍长期 CPU 空转等待 GC 完成
- 不适合 Web API、实时风控、消息推送等交互型服务——Parallel Old 的单次 STW 往往远超 200ms,极易引发超时或雪崩
- 监控确认是否生效只需看 GC 日志开头:出现 Using Parallel GC 或 Parallel GC 字样,且日志中频繁出现 PSYoungGen 与 ParOldGen 标识即可判定启用成功









