Serial和Serial Old是JVM中专为资源受限场景设计的串行GC组合,分别负责年轻代(标记-复制)和老年代(标记-整理),单线程执行、STW停顿短且确定性强,适用于单核CPU、≤1GB内存的客户端或嵌入式环境。

Serial 和 Serial Old 是 JVM 中最基础的一对串行垃圾收集器,分别负责年轻代和老年代回收。它们共用一个核心特点:单线程执行 + 全局停顿(Stop-The-World)。面试中常被问及“为什么还保留这种‘过时’的设计”,答案其实很实在——不是技术落后,而是场景精准、开销极低。
Serial 收集器:新生代的轻量选择
Serial 是唯一专为年轻代设计的单线程收集器,采用标记-复制算法。它不追求并发或吞吐,只求在资源受限时做到“快而稳”。
- 适用场景明确:客户端模式(Client VM)应用,比如早期 Java Web Start 程序、嵌入式设备上的小型 GUI 工具、开发测试环境中的本地 Spring Boot 快速启动服务
- 单核 CPU 或内存 ≤1GB 的服务器上,多线程 GC 反而因上下文切换带来额外损耗,Serial 的零线程竞争反而更高效
- 可通过 -XX:+UseSerialGC 显式启用;JDK8 及之前 Client 模式下默认启用
Serial Old 收集器:老年代的配套守门人
Serial Old 是 Serial 在老年代的对应版本,使用标记-整理算法,确保老年代空间紧凑、避免碎片化。它不独立存在,总是和 Serial 配套使用,构成完整的串行 GC 链路。
- 典型搭配:当系统禁用分代收集或仅需最小化 JVM 内存占用时(如某些 IoT 设备固件中的 Java 运行时)
- 备用角色:在 CMS 收集器发生 Concurrent Mode Failure(并发模式失败)时,JVM 会自动降级使用 Serial Old 进行 Full GC,此时虽卡顿明显,但能保证回收成功
- 注意:JDK9 起已移除 Client 模式,Serial/Serial Old 主要用于调试、教学或极简部署,生产环境极少主动选用
关于 STW 停顿的常见误解澄清
面试官常追问:“单线程停顿是不是完全不可接受?”关键要区分“停顿是否可容忍”,而非“是否存在停顿”。
- Serial 的 STW 时间通常在几毫秒到几十毫秒之间(取决于存活对象数量),对命令行工具、批处理脚本、后台定时任务几乎无感
- 真正影响体验的是停顿频率和峰值,而不是单次时长;Serial 因吞吐低、触发频繁,在高负载长周期服务中才显现劣势
- 对比 ParNew 或 G1,Serial 的优势不在延迟数字,而在确定性——没有 GC 线程调度抖动,适合做基准测试或性能归因分析
面试回答建议:紧扣“场景驱动”逻辑
不要只背“单线程”“STW”“标记复制”这些词。面试时可以这样组织语言:
- “Serial 系列不是被淘汰,而是被定位——它解决的是‘最小依赖、最高确定性’的问题。”
- “比如一个运行在树莓派上的监控代理程序,内存 512MB,CPU 单核,每分钟只上报一次数据。这时候用 Parallel 或 G1,光是 GC 线程初始化和元数据维护就可能比 Serial 多占 2~3MB 内存。”
- “Serial Old 的价值,往往体现在兜底能力上。CMS 失败后切到 Serial Old,虽然慢,但至少不 OOM;这就像汽车的安全气囊——你希望永远用不上,但必须有。”
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











