serial垃圾回收器是jvm最基础的单线程新生代收集器,采用stop-the-world机制,新生代用复制算法、老年代搭配serial old用标记-整理算法,适用于小堆(≤100mb)、单核或客户端场景,通过-xx:+useserialgc启用。

Serial 垃圾回收器是 JVM 最基础的垃圾收集器,采用单线程、全程 Stop-The-World 的方式工作,适用于资源受限或小堆场景。
单线程执行,独占式回收
Serial 收集器在执行 GC 时,只启用一个线程完成全部工作——包括对象标记、内存复制(新生代)或整理(老年代),期间所有用户线程必须暂停。这种“独占式”设计避免了多线程同步开销,但在多核环境下无法并行利用 CPU 资源。
- 新生代使用复制算法:Eden 区满触发 Minor GC,存活对象被复制到一个 Survivor 区(From → To),年龄达阈值或空间不足则晋升至老年代
- 老年代搭配 Serial Old 收集器,采用标记-整理算法:先标记存活对象,再将它们向内存一端紧凑排列,最后清理边界外空间,避免碎片
- 整个过程无并发阶段,逻辑简单、代码轻量,适合嵌入式设备或桌面应用等低内存、单核环境
明确的触发条件与暂停行为
GC 启动不依赖复杂调度,而是由内存分配失败直接触发:
- 新生代:Eden 区无法容纳新对象时,立即启动 Minor GC
- 老年代:Minor GC 后发现晋升失败(如 Survivor 区放不下、老年代剩余空间不足),或显式调用 System.gc()(配合 -XX:+UseSerialGC 时),触发 Full GC
- 每次 GC 都导致 STW,暂停时间与堆大小正相关——几十 MB 堆通常停顿几十毫秒;若堆达数 GB,停顿可能达秒级,不适合高响应要求的服务
典型适用场景与配置方式
它不是为现代服务器应用设计的,但在特定条件下仍有价值:
- Client 模式 JVM(如旧版 JDK 运行 GUI 应用)、开发测试环境、小型工具类程序
- 堆总大小建议 ≤ 100MB,否则 STW 时间易影响体验
- 启用方式:-XX:+UseSerialGC(显式启用);JDK 8 及以前在 Client 模式下默认启用,Server 模式下需手动指定
- 可配合 -Xms 和 -Xmx 控制堆初始与最大值,但无需额外调优参数——Serial 本身无并发或吞吐目标调节项
与其他收集器的关键区别
理解 Serial,关键在于对比其设计取舍:
- 对比 Parallel:后者也用复制/整理算法,但多线程并行执行,追求吞吐量;Serial 单线程,追求低延迟和低开销
- 对比 CMS/G1/ZGC:这些支持部分并发标记或转移,大幅缩短 STW;Serial 全程挂起,无任何并发能力
- 对比 ParNew:ParNew 是 Serial 的多线程翻版,行为一致但线程可配;Serial 固定单线程,不可扩展











