serial old 是 jvm 单线程、标记-整理的老年代收集器,需通过 -xx:+useserialgc 显式启用,适用于单核 cpu 或 ≤100mb 小内存的客户端/嵌入式场景,jdk 8+ 默认不启用,日志中出现 tenured 回收即表明其工作。

Java 老年代使用 Serial Old 垃圾回收器,需通过 JVM 启动参数显式指定,且通常只适用于单核 CPU 或小内存、对吞吐量要求不高的客户端场景。
Serial Old 是什么
Serial Old 是 JVM 提供的单线程、标记-整理(Mark-Compact)算法的老年代 GC 实现。它工作时会暂停所有应用线程(Stop-The-World),适合内存较小(一般 ≤ 100MB)、无多核资源或对低延迟无严格要求的环境。
如何启用 Serial Old
Serial Old 不是默认老年代收集器(JDK 8 默认是 Parallel Old,JDK 9+ 默认是 G1),必须手动配置:
- 添加 -XX:+UseSerialGC:同时启用 Serial(新生代)和 Serial Old(老年代)
- 或单独指定老年代:-XX:+UseParallelOldGC 是错的,不能混用;正确方式是仅用 -XX:+UseSerialGC,它会自动绑定 Serial + Serial Old
- 不能与 CMS、G1、ZGC、Shenandoah 等并发/分代混合收集器共存,否则 JVM 启动失败
适用场景与限制
Serial Old 在现代服务端已基本淘汰,但在以下情况仍可能用到:
- 嵌入式设备或老旧硬件(如单核 ARM 设备)
- 开发测试环境快速验证 GC 行为(因行为简单、日志清晰)
- 某些 JDK 版本在 Client 模式下(如 JDK 7 及更早)默认启用,但 Server 模式下需手动开启
- 堆总大小建议控制在 100MB 以内,否则 STW 时间可能明显影响响应
验证是否生效
启动时加上 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps,观察 GC 日志中是否出现类似:
[GC (Allocation Failure) [DefNew: ... -> ..., ... secs] [Tenured: ... -> ..., ... secs] ...其中 Tenured 区回收即表示 Serial Old 已工作(注意:JDK 8+ 日志格式可能显示为 [Full GC (System.gc()) [Tenured: ...] 或使用 G1 后不再出现 Tenured 字样,所以务必确认 JDK 版本与日志风格)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











