三色标记算法

一、三色标记是什么

三色标记是 JVM 垃圾回收中用于判断对象是否存活的一种算法。


二、三种颜色(核心)

颜色含义
白色未访问(可能是垃圾)
灰色已访问,但子对象还没处理
黑色已访问,且子对象也处理完

三、执行过程(一步一步)

假设有对象关系:

A → B → C


1️⃣ 初始状态

所有对象 = 白色


2️⃣ 从 GC Root 开始

A 变灰色


3️⃣ 扫描 A

  • A → B

  • B 变灰色

  • A 变黑色

A(黑) → B(灰) → C(白)


4️⃣ 扫描 B

  • B → C

  • C 变灰色

  • B 变黑色

A(黑) → B(黑) → C(灰)


5️⃣ 扫描 C

  • 没有子对象

  • C 变黑色

A(黑) → B(黑) → C(黑)


6️⃣ 回收

所有仍然是白色的对象 = 垃圾 → 回收


四、核心思想(一定要会说)

从 GC Root 出发,能访问到的对象 → 活着
访问不到的对象(白色) → 垃圾


五、为什么用三色标记(面试点)

👉 为了解决:

标记效率 + 支持并发 GC


六、最大问题(重点!)

❗“误删对象”(并发问题)

情况:

A → B → C

如果在标记过程中:

  1. A 不再指向 B

  2. B 还没被扫描

👉 可能导致:

B 被当成垃圾误删 ❌


七、解决方案(必须知道名字)

1️⃣ CMS:增量更新(Incremental Update)

2️⃣ G1:SATB(Snapshot At The Beginning)


八、面试标准回答

三色标记算法将对象分为白色、灰色和黑色三类,从 GC Roots 出发遍历对象,将可达对象标记为存活。白色对象表示未被访问,最终会被回收。该算法提高了标记效率,并支持并发垃圾回收,但在并发情况下可能出现误删问题,需要通过增量更新或 SATB 机制解决。