标记清扫法
传统垃圾回收方法: 标记回收法(go v1.3)
垃圾回收法的缺点:
1.需要STW(stop the World)
2.需要扫描整个heap
3.清理时会产生heap碎片
三色标记法
三种颜色:
- 白色对象(可能死亡):未被回收器访问到的对象。在回收开始阶段,所有对象均为白色,当回收结束后,白色对象均不可达。
- 灰色对象(波面):已被回收器访问到的对象,但回收器需要对其中的一个或多个指针进行扫描,因为他们可能还指向白色对象。
- 黑色对象(确定存活):已被回收器访问到的对象,其中所有字段都已被扫描,黑色对象中任何一个指针都不可能直接指向白色对象。
方法特点: 逐层扫描
新的问题:
三色标记不适用STW时,黑色对象(对象4)突然引用白色对象(对象3),另外一个灰色对象(对象2)又断掉了白色对象,本来被引用达到白色对象就会被删除。
强弱三色不变式和屏障机制
强三色不变式: 不允许黑色对象引用白色对象
弱三色不变式: 黑色可以引用白色对象,但是白色对象的上游链路必须又灰色对象
插入写屏障(栈不可用): 黑色对象插入一个对象时,这个对象标记位灰色对象。满足了强三色不变式。
注意: 栈空间回收白色对象时,会STW,再次扫描一遍栈空间(缺点)
删除写屏障: 白色对象被删除前会被标记位灰色,等待下一轮再删除(缺点),目的是为了突然有黑色对象突然引用这个对象。满足了弱三色不变式。
混合读写屏障:
- GC开始栈上对象全部扫描标记为黑色(之后不再进行扫描,无需STW)
- GC期间栈上添加的对象都添加为黑色
- 被删除对象标记为灰色
- 被添加对象标记为灰色
参考资料:
Golang中GC回收机制三色标记与混合写屏障 - 刘丹冰
GO问题集 - 饶全成