【Go基础】垃圾回收演进|三色标记法

GO1.3标记清除,整体需要STW:
1.暂停,找到可达和不可达对象,2. 标记可达对象,3. 清除未标记对象,4. 结束暂停

GO1.5三色标记法,堆启动写屏障,栈不启动,全部扫描一次后,需要重新扫描栈(STW),效率低

如果没有STW,对象丢失的2个条件:

  1. 黑色对象指向白色对象(白色挂在黑色下面)
  2. 灰色对象与其可达白色对象之间遭到破坏(灰色也丢失了该白色)

屏障机制,保障对象不丢失的2种方式:

  1. 强三色不变式:不允许黑色对象指向白色对象
  2. 弱三色不变式:允许黑色对象指向白色对象,但是该白色对象要被灰色对象可达

为此,go初步得到两种屏障方式:

  1. 插入写屏障:只使用在堆中,将黑色指向的白色对象标记为灰色;栈要启动STW重新三色标记扫描(仍然需要STW重新扫描栈)
  2. 删除写屏障:被删除的白色节点标记为灰色(保护灰色对象到白色对象的路径不会断),所以最后一个指向它的指针也依旧可以活过这一轮,在下一轮GC中被清理掉(回收精度低,开始时STW记录初始快照)

为什么在栈中不使用:

GO1.8三色标记法,混合写屏障,栈不启动,堆启动,几乎不需要STW,效率高

结合得到混合写屏障(满足弱三色不变):

  1. 开始时将所有栈上的可达节点标记为黑色,在GC期间栈上新增的也标记为黑色(无需STW)
  2. 删除和新增的全部标记为灰色

参考资料:

  1. https://www.bilibili.com/video/BV1wz4y1y7Kd/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值