Panda白话 - G1垃圾收集器 - 三色标记法、漏标、增量更新、SATB
上文讲到G1在并发标记过程中,通过三色标记法来标记存活对象, 三色标记法存在漏标问题,会影响程序正确性, G1采用SATB方案解决漏标问题,本文我们就来重点分析一下SATB
SATB - Snapshot At The Beginning 初始快照
- 由Taiichi Yuasa开发的一个算法 - 首先它是一种思想
- 主要用于GC的并发标记阶段
- 记录并发标记是mutator修改的引用记录,remark阶段(STW)无需全量重新扫描标记
- 快照是以BitMap(位图)的方式实现,BitMap存放对象存活标记,1 为黑色 即存活

见上图、Region包含了5个指针:
- Bottom - 总是指向Region的起始位置
- Previous TAMS - 指向上一次并发处理后的地址
- Next TAMS - 指向并发标记开始之前内存已经分配成功的地址
- Yop - 指向当前内存分配成功的地址
- End - 总是指向Region的终点位置
TAMS - top-at-mark-start
对象在Region中是连续分配的
可以知道:
- [Bottom,End]区间就是Region内存空间大小
- [Bottom,Prev]区间就是上次并发标记结束后,已经标记过的对象内存
- [Prev,Next]区间就是本次并发标记标记到的对象内存
- [Next,Top]区间就是并发标记过程中Mutator新增的对象分配的内存地址
- [Top,End] 区间就是Region还未分配的空闲内存
由上可知,Prev和Next指针解决了并发标记中内存区域问题,并发标记引入了两个**数据结构**来记录内存标记状态,
- PrevBitMap - 记录Prev指针之前内存标记情况、即【Bottom,Prev】区间
- NextBitMap - 记录Next指针之前内存标记情况、即【Bottom,Next】区间
图解两次并发标记过程:

第一次并发标记开始前 :
- PrevBitMap 为空,NextBitMap 待标记

第一次标记结束后:
- NextBitMap 标记了分区对象存活情况
- NextBitMap位图中黑色区域表示对应对象存活
- 并发标记过程中Mutator继续运行,产生新的对象,Top指针继续增长

第二次并发标记开始前:
- 重置指针,Prev指针指向Next指针位置

本文深入解析G1垃圾收集器的三色标记法,探讨其存在的漏标问题,以及Taiichi Yuasa的SATB算法如何通过快照机制和写屏障优化并发标记,减少垃圾识别误差,重点关注白色垃圾的处理和写前屏障在其中的作用。
最低0.47元/天 解锁文章
1713

被折叠的 条评论
为什么被折叠?



