JVM 三色标记算法¶
一、是什么¶
并发标记算法,标记存活对象。
二、三种颜色¶
- 黑色:已标记,所有引用都扫描过。
- 灰色:自己被标记,但引用还没扫完。
- 白色:未标记。
三、过程¶
- 初始:所有对象白色。
- GC Roots 标记成灰色。
- 灰色对象出队,引用的对象标记成灰色,自己变黑色。
- 重复直到没有灰色。
- 白色对象就是垃圾。
四、并发问题¶
用户线程在标记时改引用,可能把黑色对象的引用改成白色对象,导致漏标。
五、怎么解决¶
1. 增量更新(Incremental Update)¶
新增引用时,把被引用对象重新标记成灰色。
2. 原始快照(Snapshot At The Beginning)¶
删除引用时,记录被删的对象,最后再标记一次。
六、为什么用三色标记¶
- 并发标记,不用全程 STW。
- 标记阶段用户线程还能跑。
七、CMS vs G1¶
- CMS:增量更新。
- G1:原始快照。
一句话
三色标记 = 黑/灰/白,并发标记,配合写屏障解决漏标。