最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
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日志中的收集器标识:
-
PSFullGC或Full 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。
不复杂但容易忽略
相关文章
- 猫王小黄鸭 07-21
- 日落海滩时尚人像 07-21
- iOS哔咔网页版入口-哔咔漫画iOS网页版入口 07-21
- 高级定制时装风暴巨片 07-21
- 卧室抓拍人像生活方式 07-21
- 影棚电影级时尚肖像 07-21