serial收集器是jvm最基础的单线程垃圾回收器,专为单核、小堆(≤100mb)、客户端或嵌入式场景设计;启用参数为-xx:+useserialgc,新生代用复制算法、老年代用标记-整理算法,全程stw且无并发能力。

Java 中 Serial 收集器是 JVM 自带的最基础、最轻量的垃圾回收器,专为单线程环境设计,适用于客户端场景或小内存、低并发的应用(比如嵌入式设备、开发测试环境)。它不依赖多核 CPU,所有 GC 工作(包括年轻代和老年代)都在一个线程中完成,因此没有线程切换开销,但会触发“Stop-The-World”——即 GC 期间整个应用暂停。
如何启用 Serial 收集器
Serial 收集器默认在某些客户端模式 JVM(如 32 位 Windows JDK)中自动启用。若需显式指定,可通过 JVM 启动参数强制使用:
- -XX:+UseSerialGC:启用 Serial 收集器(同时作用于年轻代和老年代)
- 该参数会自动禁用其他收集器(如 Parallel、CMS、G1),无需额外关闭
- 无需搭配 -XX:+UseParallelGC 或 -XX:+UseConcMarkSweepGC 等互斥参数
Serial 收集器的内存分区与回收行为
Serial 使用“复制算法”回收年轻代(Eden + Survivor),用“标记-整理”算法回收老年代(Tenured):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 年轻代 GC(Minor GC):暂停应用,将 Eden 和一个 Survivor 中存活对象复制到另一个 Survivor;空间不足时晋升到老年代
- 老年代 GC(Major/Full GC):当老年代空间不足或显式调用 System.gc()(且未禁用)时触发,对整个堆做标记并压缩碎片,耗时通常远长于 Minor GC
- 不支持并发或并行阶段,所有步骤串行执行,适合内存小(例如 ≤ 100MB)、对象生命周期短、GC 频率低的场景
适用场景与配置建议
Serial 不适合高吞吐或低延迟服务,但在特定条件下仍具实用价值:
- 运行在单核 CPU 或资源受限的机器上(如 IoT 设备、容器限制为 1 核)
- 桌面应用、工具类程序(如 IDE 插件、脚本工具),启动快、驻留时间短
- 开发调试阶段,希望 GC 行为简单可预测,便于观察对象生命周期
- 配合小堆配置更有效,例如:-Xms64m -Xmx64m -XX:+UseSerialGC
验证是否生效
添加 GC 日志参数可确认 Serial 是否被实际使用:
- -Xlog:gc*:stdout:time(JDK 10+)或 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps(JDK 8/9)
- 日志中出现 Using Serial 或 GC 日志行以 [DefNew:(代表 Default New Generation,即 Serial 年轻代)开头,说明启用成功
- 若看到 ParNew、PSYoungGen、G1YoungGen 等字样,则 Serial 未生效,需检查参数冲突
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










