serial和serial old是jvm中最基础的单线程垃圾回收器,serial用于年轻代、采用复制算法并触发stw,serial old用于老年代、采用标记-整理算法且stw时间更长。

Serial 和 Serial Old 是 JVM 中最基础的垃圾回收器,专为单线程环境设计,适用于客户端模式或小型应用。它们不使用多线程并行工作,所有 GC 活动(包括标记、清理、压缩)均由 JVM 唯一的 GC 线程完成,同时会触发 全局 Stop-The-World(STW),即整个 Java 应用线程全部暂停。
Serial 回收器:年轻代单线程回收
Serial 是 JDK 早期默认的年轻代收集器(尤其在 Client 模式下),采用 复制算法(Copying)管理 Eden 和两个 Survivor 区。
- GC 开始时,所有应用线程立即挂起,仅保留一个 GC 线程运行
- 它遍历 GC Roots,标记存活对象,然后将这些对象复制到一个空的 Survivor 区(或晋升到老年代)
- 复制完成后,原 Eden 和另一个 Survivor 区被一次性清空,无需碎片整理(复制本身隐含整理)
- 适合堆内存小(如几十 MB)、对吞吐量要求不高、CPU 资源受限(如嵌入式设备)的场景
Serial Old 回收器:老年代单线程回收
Serial Old 是 Serial 在老年代的对应实现,采用 标记-整理算法(Mark-Compact),避免内存碎片。
- 同样全程单线程执行:先标记所有可达对象,再将存活对象向内存一端移动,最后清理边界外的空间
- 由于涉及对象移动和地址更新,STW 时间通常比 Serial 更长,尤其在老年代较大时
- 它常作为 CMS 收集器的后备方案(当 CMS 并发失败时触发),也用于 Client 模式下的默认老年代回收
- 若搭配 Parallel Scavenge 使用(需显式指定 -XX:+UseParallelOldGC 以外的配置),则必须配 Serial Old 或 CMS;但现代 JDK 中已基本被 Parallel Old 替代
单线程回收的关键行为特征
两者共有的核心特点是“独占式”与“确定性”,不依赖并发协调,逻辑简单、开销低,但也带来明显局限:
- STW 时间与堆大小、存活对象数量强相关——老年代越大、对象越多,停顿越久
- 无法利用多核 CPU,即使机器有多个 CPU 核心,GC 仍只用 1 个线程
- 无并发标记或并发清理阶段,所有步骤串行阻塞执行
- 适合场景明确:内存小(如 ≤ 100MB)、用户可接受秒级停顿、部署环境资源紧张(如旧笔记本、ARM 小设备)
如何启用与验证
可通过 JVM 参数显式启用(JDK 8 及以前在 Client 模式下默认启用,Server 模式下需手动指定):
- -XX:+UseSerialGC:同时启用 Serial(年轻代)和 Serial Old(老年代)
- 添加 -XX:+PrintGCDetails -Xloggc:gc.log 查看日志,每条 GC 记录中会显示 [DefNew](Serial 的别名)和 [Tenured](Serial Old 的别名)
- 日志中若出现类似 "DefNew: 4096K->512K(4096K), 0.0052342 secs",说明是 Serial 工作;"Tenured: 8192K->6240K(8192K), 0.0218451 secs" 则对应 Serial Old
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











