三色标记法的实现原理和具体步骤
三色标记法的实现原理和具体步骤
提示
题眼: 必备。
Go 使用三色标记法来做并发垃圾回收。
三种颜色分别表示:
- 白色:当前还没有被标记到的对象,回收结束后仍是白色的对象会被当成垃圾。
- 灰色:对象本身已经被发现,但它引用的子对象还没有全部扫描完。
- 黑色:对象本身和它引用的子对象都已经扫描完成。
具体流程可以分成四步:
- 初始阶段(STW):短暂暂停程序,扫描根对象并标记为灰色。
- 并发标记:后台并发处理灰色对象,把可达对象持续标成灰色或黑色。
- 标记终止(STW):再次短暂停顿,处理剩余灰色对象,确保标记完成。
- 并发清理:回收仍然是白色的对象。
重要
参考答案:
三色标记法最大的特点就是把标记过程做成了可并发、可渐进执行的形式。它把堆里的对象分成黑、灰、白三类。黑色表示已经确认存活且子对象也扫描完了,灰色表示对象本身活着但子对象还没扫完,白色表示暂时还没被证明存活。
GC 开始时,会先做一次很短的 STW,从根对象出发把第一批对象变成灰色。然后进入并发标记阶段,不断从灰色对象出发扫描它们引用的对象,扫描完成后再把自己变成黑色。最后再做一次短暂的 STW 收尾,确保没有漏网的灰色对象。
整个标记完成后,剩下还是白色的对象就可以被当作垃圾回收了。它相比传统长时间 STW 的标记清除,最大的优势就是能把停顿拆成两个更短的阶段。
