商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > JVM中Parallel收集器在进行Full GC时与Serial Old在标记-整理算法细节上的多线程改造

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

  发布于2026-07-09 阅读(0)

扫一扫,手机访问

聊到JVM老年代收集器,Parallel Old 这个角色其实挺有意思的。它是 Parallel Sca venge 的标配搭档——一个多线程、标记-整理算法的老年代收集器。

它的核心思路是:通过并行标记、分段整理以及工作窃取机制,把吞吐量拉到尽可能高。相比单线程的 Serial Old,它在 STW 时间上有本质性的改善。说白了,就是更适合那种吞吐量优先的批处理场景。

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

不过这里有个常见误区:Parallel 收集器本身其实不负责 Full GC——它只管新生代(Parallel Sca venge)。Full GC 中老年代的回收由配套的老年代收集器承担。在 Parallel Sca venge 搭配场景下,老年代默认用的是 Parallel Old,而不是 Serial Old。Serial Old 更像是“备胎”,只在特定条件下才被动启用,比如 CMS 失败、JDK 早期版本,或者你主动显式配置了 -XX:+UseSerialOldGC

所以,如果直接问“Parallel 收集器在 Full GC 时与 Serial Old 的标记-整理算法多线程改造”,概念上就有点混淆了。正确的对应关系是:

  • Parallel Sca venge + Parallel Old 是一对协同工作的组合;
  • Serial Old 是单线程、标记-整理的老年代收集器;
  • Parallel Old 才是 Parallel Sca venge 的原配搭档,同样是标记-整理算法,但实现了多线程并发标记与整理——这才是你真正想了解的那部分“多线程改造”。

下面直接拆解 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。

不复杂但容易忽略。

本文转载于:https://www.php.cn/faq/2793794.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注