Serial收集器是单线程GC,全程独占资源并触发STW;新生代用复制算法(Eden+S0/S1),老年代由Serial Old用标记-整理算法回收;通过-XX:+UseSerialGC启用,日志可见Serial或SerialOld标识。

Serial 收集器在单线程环境下工作,本质是“只用一个 GC 线程、全程独占资源、强制暂停所有用户线程”。它不依赖多核协作,也不做并发协调,而是把全部 GC 任务串行执行到底。
单线程不是“只用一个 CPU”,而是“唯一一条 GC 线程全程掌控”
它不创建额外 GC 线程池,也不与应用线程争抢调度权;JVM 内部仅启动一条专用 GC 线程,该线程从标记开始、复制或整理结束,中间无中断、无切换、无同步。所有用户线程(比如你写的 main 线程、HTTP 处理线程)在此期间完全冻结——这就是 Stop-The-World(STW)的实质。
- 没有线程创建/销毁开销,也没有锁竞争或缓存一致性维护成本
- 无需考虑对象跨线程引用的并发修改问题,算法逻辑极简
- 适用于 Client 模式 JVM,默认启用,尤其在 JDK 早期版本中广泛使用
新生代用复制算法,快且连续
它把年轻代划分为 Eden + 两个 Survivor 区(S0/S1)。每次 Minor GC 时:
- 只扫描 Eden 和当前 From Survivor 中的对象
- 将存活对象一次性复制到 To Survivor 区(年龄达标或空间不足则直接晋升老年代)
- 清空 Eden 和 From 区,再交换 S0/S1 角色
- 全程不遍历死亡对象,不整理碎片,内存分配始终连续
老年代靠 Serial Old 配合,用标记-整理保空间规整
当对象晋升或触发 Full GC 时,Serial Old 接管老年代回收:
立即学习“Java免费学习笔记(深入)”;
- 第一阶段:从 GC Roots 开始递归标记所有可达对象
- 第二阶段:将所有存活对象向内存起始端紧凑移动,消除中间空洞
- 第三阶段:更新所有指向这些对象的引用地址,回收整理后边界外的空间
- 相比复制算法,更适合存活率高的老年代,避免大量复制开销
怎么确认它正在运行
可通过 JVM 启动参数和日志验证:
- 显式启用:-XX:+UseSerialGC(同时激活 Serial 新生代 + Serial Old 老年代)
- 查看默认配置:java -XX:+PrintCommandLineFlags -version,若输出含 -XX:+UseSerialGC 即生效
- 开启详细 GC 日志:-Xlog:gc*,gc+heap=debug,日志中出现 Serial 或 SerialOld 字样即表示正在工作


















