三色标记法
初始化是对象都是白的
颜色 | 对应身份 |
---|---|
白 | 可以清除 |
灰 | 移动到不可清除前的缓冲区域 |
黑 | 不可进行垃圾回收的变量 |
- 所有对象都是白色区域
- 确认顶级内存区域,移动到灰色区域
- 确认子级内存区域,并将顶级内存区域移动到黑色区域
- 将所有有引用的内存移动到black
- 清除白色区域
为什么可以异步执行
三色标记法因为多了一个白色的状态来存放不确定的对象,所以可以异步地执行。当然异步执行的代价是可能会造成一些遗漏,因为那些早先被标记为黑色的对象可能目前已经是不可达的了。所以三色标记法是一个 false negative(假阴性)的算法。
除了异步标记的优点,三色标记法掌握了更多当前内存的信息,因此可以更加精确地按需调度,而不用像标记清扫法那样只能定时执行。