Java中需通过JVM参数-XX:+UseSerialGC启用Serial收集器,它组合使用Serial(新生代)和Serial Old(老年代),适用于单核CPU、小堆(≤100MB)及开发测试场景,不推荐生产使用。

Java 中不能“使用”Serial 收集器,而是通过 JVM 启动参数**启用**它。Serial 是 JVM 内置的、最基础的垃圾收集器,适用于单核 CPU 或小型客户端应用,默认在 Client 模式(已废弃)或某些特定场景下自动选用,但现代 JDK(如 JDK 8u212+ 及 JDK 11+)中需显式指定才能启用。
如何启用 Serial 收集器
Serial 收集器分为两部分:针对新生代的 Serial(-XX:+UseSerialGC 会同时启用它)和针对老年代的 Serial Old。启用方式统一:
- 添加 JVM 参数:-XX:+UseSerialGC
- 该参数会强制使用 Serial(新生代) + Serial Old(老年代)组合,禁用其他 GC 算法
- 例如启动命令:
java -XX:+UseSerialGC -jar myapp.jar
适用场景与限制
Serial 收集器是单线程、STW(Stop-The-World)式回收器,所有 GC 阶段都由一个线程完成:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 适合内存小(如堆 ≤ 100MB)、CPU 核心少(如嵌入式设备、开发测试机)、对吞吐量要求不高、能接受较长暂停时间的场景
- 不适用于服务端应用或大堆(如 > 1GB),因为 STW 时间随堆增大而显著增长
- JDK 17+ 中仍保留支持,但官方文档明确标注为“legacy”,不推荐生产使用
验证是否生效
启用后可通过 JVM 日志确认:
立即学习“Java免费学习笔记(深入)”;
- 添加日志参数:
-Xlog:gc*:file=gc.log:time(JDK 11+)或-XX:+PrintGCDetails -XX:+PrintGCTimeStamps(旧版) - 日志中出现类似
Using Serial或[DefNew(DefNew 表示默认新生代收集器,即 Serial)即表示生效 - 也可用
jstat -gc <pid>查看,若输出中NGCMN/NGCMX/NGC值稳定且 GC 频率低,结合日志可辅助判断
常见误区提醒
Serial 不是通过代码调用或 API 使用的,也不是 Spring 或框架可配置的组件:
- 它完全由 JVM 在启动时根据参数决定,运行中不可切换
-
-XX:+UseParallelGC、-XX:+UseG1GC等参数会覆盖-XX:+UseSerialGC,注意参数冲突 - 不要试图在代码中“触发 Serial GC”,
System.gc()最多建议 JVM 回收,实际执行哪类 GC 仍由 JVM 决定

















