跳转至

JVM 三色标记算法

一、是什么

并发标记算法,标记存活对象。

二、三种颜色

  • 黑色:已标记,所有引用都扫描过。
  • 灰色:自己被标记,但引用还没扫完。
  • 白色:未标记。

三、过程

  1. 初始:所有对象白色。
  2. GC Roots 标记成灰色。
  3. 灰色对象出队,引用的对象标记成灰色,自己变黑色。
  4. 重复直到没有灰色。
  5. 白色对象就是垃圾。

四、并发问题

用户线程在标记时改引用,可能把黑色对象的引用改成白色对象,导致漏标。

五、怎么解决

1. 增量更新(Incremental Update)

新增引用时,把被引用对象重新标记成灰色。

2. 原始快照(Snapshot At The Beginning)

删除引用时,记录被删的对象,最后再标记一次。

六、为什么用三色标记

  • 并发标记,不用全程 STW。
  • 标记阶段用户线程还能跑。

七、CMS vs G1

  • CMS:增量更新。
  • G1:原始快照。

一句话

三色标记 = 黑/灰/白,并发标记,配合写屏障解决漏标。