启用-XX:+UseSerialGC可启用Serial(新生代)+Serial Old(老年代)组合,适用于≤200MB小堆、单核客户端场景,停顿稳定在10–50ms,日志显示DefNew与Tenured即生效。

直接加 -XX:+UseSerialGC 就能启用 Serial(新生代) + Serial Old(老年代)组合,专为轻量级、单核、小堆客户端场景设计。它不拼吞吐,重在停顿短、行为稳、日志干净。
基础参数配置
启动 Java 程序时指定以下 JVM 参数即可生效:
- -XX:+UseSerialGC:强制启用 Serial(年轻代)和 Serial Old(老年代)组合
- -Xms64m -Xmx64m:固定堆大小(如 64MB),避免动态扩容带来的 GC 不确定性
- -XX:SurvivorRatio=8:让 Eden 区占比更大(Eden : From : To = 8 : 1 : 1),减少 Survivor 区拷贝频率
适用边界要清楚
Serial 收集器的舒适区很明确,超出就容易失稳:
- 总堆建议 ≤200MB;新生代控制在 20–80MB 效果最佳
- 单次 Minor GC 停顿超过 100ms,或 Full GC 开始频繁(比如每分钟数次),说明已超负荷
- 若对象存活时间变长、晋升到老年代增多,Serial Old 的标记-整理会明显拖慢节奏
验证是否真正生效
加完参数后运行程序并开启 GC 日志,关键看两点:
立即学习“Java免费学习笔记(深入)”;
- 日志中出现 DefNew(代表 Serial 新生代)和 Tenured(代表 Serial Old 老年代)字样,说明配置成功
- 关注 pause 时间字段——不是看吞吐率,而是盯单次 STW 是否稳定在 10–50ms(小堆下典型值)
- 若看到 ParallelGC 或 G1 Evacuation Pause,说明参数被覆盖或未生效
为什么适合单核客户端
Serial 的优势不在“快”,而在“确定”:
- 单线程执行,无锁竞争、无线程调度、不跨 CPU 缓存同步,整个 GC 是一条直线
- 复制算法处理朝生暮死对象极高效,几十 MB 堆里只需搬运少量存活对象
- 标记-整理虽有移动开销,但在百兆级老年代中仍可控,且彻底避免碎片
- 桌面工具、嵌入式设备(如树莓派)、本地开发环境等,更在意“每次停顿 ≤30ms”而非平均延迟


















