Serial Old和Parallel Old均为老年代标记-整理收集器,区别在于:Serial Old单线程、适用于小内存客户端;Parallel Old多线程、吞吐优先,用于多核服务器。

Serial Old 和 Parallel Old 都是 JVM 中用于老年代的垃圾收集器,都基于标记-整理(Mark-Compact)算法,但核心差异在于执行方式与适用场景——前者单线程、轻量稳定;后者多线程、吞吐优先。
算法逻辑一致,但执行路径不同
两者都采用标记-整理算法,分两步:先遍历对象图,标记所有存活对象;再将存活对象向内存一端紧凑排列,清除边界外的废弃空间。这种设计避免了标记-清除产生的内存碎片,也规避了复制算法在老年代高存活率下的大量移动开销。
区别在于:Serial Old 全程由一个线程完成全部步骤,包括标记、整理和清理;Parallel Old 则将标记和整理阶段并行化,多个线程协同工作,显著缩短 STW 时间(尤其是整理阶段耗时占比高时)。
停顿时间与系统资源利用对比
Serial Old 的 STW 时间通常更长,尤其在老年代较大或对象密集时,单线程整理过程成为瓶颈;Parallel Old 通过多线程分摊工作负载,在多核 CPU 上可将 Full GC 停顿缩短 30%–60%,但会带来额外的线程调度与同步开销。
- Serial Old:适合单核 CPU、内存小(如 ≤512MB)、对吞吐量不敏感的嵌入式或桌面应用
- Parallel Old:适合多核服务器、堆内存较大(如 ≥2GB)、以吞吐量为目标的后台批处理系统
组合使用与配置方式
它们不单独启用,需与对应的新生代收集器配对使用:
- Serial + Serial Old:用 -XX:+UseSerialGC 一键启用,适用于 Client 模式或资源受限环境
- Parallel Scavenge + Parallel Old:默认组合(JDK 8+),也可显式指定 -XX:+UseParallelGC -XX:+UseParallelOldGC
注意:Parallel Old 是 JDK 6 引入的,早期版本(如 JDK 5)中 Parallel Scavenge 只能搭配 Serial Old,此时老年代回收成为性能短板。
实际选型关键看三点
不是“哪个更好”,而是“哪个更合适”:
- 看硬件:单核或低配机器 → Serial Old;4 核以上且内存充足 → Parallel Old
- 看目标:响应延迟敏感(如交互型 GUI)→ 小堆 + Serial Old 更可控;吞吐优先(如定时报表)→ Parallel Old 更稳
- 看兜底需求:CMS 或 G1 回收失败时,Serial Old 常作为备用方案触发 Full GC,而 Parallel Old 不承担此角色

















