golang垃圾回收(笔记)

114 阅读2分钟

标记清扫法

传统垃圾回收方法: 标记回收法(go v1.3)

垃圾回收法的缺点
1.需要STW(stop the World)
2.需要扫描整个heap
3.清理时会产生heap碎片

三色标记法

三种颜色

  • 白色对象(可能死亡):未被回收器访问到的对象。在回收开始阶段,所有对象均为白色,当回收结束后,白色对象均不可达。
  • 灰色对象(波面):已被回收器访问到的对象,但回收器需要对其中的一个或多个指针进行扫描,因为他们可能还指向白色对象。
  • 黑色对象(确定存活):已被回收器访问到的对象,其中所有字段都已被扫描,黑色对象中任何一个指针都不可能直接指向白色对象。

方法特点: 逐层扫描

新的问题
三色标记不适用STW时,黑色对象(对象4)突然引用白色对象(对象3),另外一个灰色对象(对象2)又断掉了白色对象,本来被引用达到白色对象就会被删除。

image.png

强弱三色不变式和屏障机制

强三色不变式: 不允许黑色对象引用白色对象
弱三色不变式: 黑色可以引用白色对象,但是白色对象的上游链路必须又灰色对象

插入写屏障(栈不可用): 黑色对象插入一个对象时,这个对象标记位灰色对象。满足了强三色不变式。
注意: 栈空间回收白色对象时,会STW,再次扫描一遍栈空间(缺点)

image.png

删除写屏障: 白色对象被删除前会被标记位灰色,等待下一轮再删除(缺点),目的是为了突然有黑色对象突然引用这个对象。满足了弱三色不变式。

image.png

混合读写屏障

  1. GC开始栈上对象全部扫描标记为黑色(之后不再进行扫描,无需STW)
  2. GC期间栈上添加的对象都添加为黑色
  3. 被删除对象标记为灰色
  4. 被添加对象标记为灰色

参考资料:
Golang中GC回收机制三色标记与混合写屏障 - 刘丹冰
GO问题集 - 饶全成