一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

JVM中Parallel收集器做Full GC时与Serial Old在标记-整理算法细节上的多线程改造

时间:2026-07-09 12:15:46 编辑:袖梨 来源:一聚教程网

Parallel Old是Parallel Scavenge的配套老年代收集器,采用多线程标记-整理算法,通过并行标记、分段整理和工作窃取机制提升吞吐量,STW时间显著低于单线程Serial Old,适用于吞吐量优先的批处理场景。

Parallel收集器本身不负责Full GC,它只管理新生代(Parallel Scavenge),而Full GC中涉及老年代的回收,由配套的老年代收集器承担。在Parallel Scavenge搭配场景下,老年代默认使用的是Parallel Old收集器,不是Serial Old。Serial Old是它的备用方案,仅在特定条件下被动启用(如CMS失败、JDK早期版本或显式配置 -XX:+UseSerialOldGC)。

所以问题中“Parallel收集器在进行Full GC时与Serial Old在标记-整理算法细节上的多线程改造”这一提法存在概念混淆:

  • Parallel Scavenge 和 Parallel Old 是一对协同工作的组合;
  • Serial Old 是单线程、标记-整理(Mark-Compact)的老年代收集器;
  • Parallel Old 是Parallel Scavenge的原生搭档,也是标记-整理算法,但实现了多线程并发标记与整理——这才是你实际想了解的“多线程改造”。

下面直接说明 Parallel Old 相比 Serial Old 在标记-整理算法上的关键改造点:

Parallel Old 的多线程标记-整理实现要点

  • 并行标记阶段

    • 多个GC线程协作遍历老年代对象图,共享标记位图(mark bitmap);
    • 使用工作窃取(work-stealing)机制动态分配待扫描对象栈,避免线程空闲;
    • 需要同步处理跨代引用(如新生代到老年代的引用),通过卡表(card table)+增量更新(dirty card scanning)保障准确性。
  • 并行整理阶段

    • 先并行计算每个线程负责整理的内存段(region-based compaction);
    • 各线程独立计算存活对象的新地址,并发更新对象头和引用字段(需CAS或屏障支持);
    • 整理后内存呈连续紧凑布局,无碎片,但整理过程比标记-清除更重,多线程可显著摊薄延迟。
  • STW 时间大幅缩短

    • Serial Old 单线程整理整个老年代,耗时与老年代大小强相关(比如1GB老年代可能停顿300ms+);
    • Parallel Old 将整理任务分片给N个线程,理论加速比接近N(受内存带宽与同步开销限制,通常达3~8倍提速)。

为什么Serial Old仍被保留?

  • 作为兜底机制:当Parallel Old因内存不足、对象分布异常或JVM资源受限(如CPU核数极少)无法启动时,自动降级为Serial Old;
  • Client模式兼容性:旧版JVM(如JDK 6/7默认Client VM)仍依赖Serial+Serial Old组合;
  • 极简调试场景:单线程行为确定、日志清晰,便于定位内存泄漏或引用链问题。

如何确认当前Full GC用的是Parallel Old还是Serial Old?

查看GC日志中的收集器标识:

  • PSFullGCFull GC (Parallel) → 表示 Parallel Old 执行了Full GC;
  • Full GC (System)Full GC (Serial) → 很可能触发了Serial Old(尤其见于CMS失败后回退);
  • 启动参数中若含 -XX:+UseParallelOldGC(JDK 8+默认开启),则优先走Parallel Old;显式加 -XX:+UseSerialOldGC 才强制启用Serial Old。

不复杂但容易忽略

热门栏目