Serial和Parallel垃圾收集器均基于可达性分析,从相同GC Roots(虚拟机栈、方法区静态/常量引用、JNI引用、synchronized锁对象、JVM内部强引用)出发,采用三色标记逻辑遍历对象图;区别仅在于Serial单线程扫描,Parallel多线程并行扫描,二者均STW且无需写屏障。

Serial 和 Parallel 垃圾收集器在对象引用扫描策略上本质一致,都基于“可达性分析”,从 GC Roots 出发进行遍历,但执行方式和并发模型不同。
GC Roots 的识别范围相同
两者都严格遵循 JVM 规范定义的 GC Roots 集合,包括:
- 虚拟机栈中局部变量表引用的对象(如方法参数、临时变量)
- 方法区中类静态字段(public static 等)引用的对象
- 方法区中常量池(如字符串常量)引用的对象
- 本地方法栈中 JNI 引用的对象
- 被 synchronized 持有的锁对象
- JVM 内部强引用(如 Class 对象、核心异常类实例)
扫描过程都采用“三色标记”逻辑
虽然 Serial/Parallel 默认不公开使用三色标记术语,但其标记阶段实际行为与该模型吻合:
- 黑色:该对象及其所有引用已被完全扫描,确认存活
- 灰色:该对象已发现,但其引用的对象尚未全部扫描完毕
- 白色:尚未访问,初始状态;标记结束后仍为白色的对象判定为可回收
扫描从 GC Roots 开始,逐层推进——Roots 入队为灰色,弹出后标记为黑,并将其引用对象加入灰色队列;重复直至灰色队列为空。
关键差异在于线程模型与扫描调度
Serial 是单线程扫描,Parallel 是多线程并行扫描,但二者都不与用户线程并发:
- Serial:仅一个线程执行完整标记过程,无同步开销,适合小堆、单核或低延迟容忍场景
- Parallel:多个工作线程协作扫描同一堆区域,需加锁或划分任务边界(如按内存页分片),存在少量同步成本,但吞吐更高
- 两者均发生 STW(Stop-The-World),因此无需处理“对象引用在扫描中变更”的并发问题,不会出现漏标或多标
不涉及写屏障或增量更新
与 CMS 或 G1 不同,Serial 和 Parallel 在标记阶段不依赖写屏障(Write Barrier)来拦截引用变更,因为整个标记过程在用户线程暂停下完成。这意味着:
- 无需在赋值操作前后插入额外指令
- 不会因并发修改导致重新标记(re-mark)环节
- 标记结果绝对准确,不存在“B→D 变为 A→D 后 D 被误判为垃圾”的风险

















