golang 垃圾回收(四)删除写屏障 2020/5/27 13:00

本文介绍了Golang垃圾回收中的删除写屏障,这是一种基于起始快照的解决方案,需要在GC开始前STW扫描根部,确保所有可达对象为灰色。通过写屏障捕捉赋值器对白色对象的删除操作,保持弱三色不变式,保证垃圾回收的正确性。文章详细阐述了赋值器颜色、三色不变式等概念,并探讨了删除写屏障如何维护弱三色不变式。
摘要由CSDN通过智能技术生成
  • 接上一篇 golang 垃圾回收的梳理,这篇讲删除写屏障,golang 的内存写屏障是由插入写屏障到混合写屏障过渡的。虽然 golang 从来没有直接使用删除写屏障,但是混合写屏障却用到了删除写屏障的思路。

    删除写屏障:也叫做基于其实快照的解决方案(snapshot-at-the-begining)。故名思义,就是在开始 gc 之前,必须 STW ,对整个根做一次起始快照。当赋值器(业务线程)从灰色或者白色对象中删除白色脂针时候,写屏障会捕捉这一行为,将这一行为通知给回收器。
    这样,基于起始快照的解决方案保守地将其目标对象当作存活的对象,这样就绝对不会有被误回收的对象,并且还有工作量浮动放大的风险。术语叫做追踪波面的回退。

    删除写屏障(基于起始快照的写屏障)有一个前提条件,就是起始的时候,把整个根部扫描一遍,让所有的可达对象全都在灰色保护下(根黑,下一级在堆上的全灰),之后利用删除写屏障捕捉内存写操作,确保弱三色不变式不被破坏,就可以保证垃圾回收的正确性。

    伪代码如下:

    atomic Write(src, i, ref)
        shade(src[i])
        src[i] <- ref
    
    

    复习一下一些概念

    赋值器的颜色

    • 灰色赋值器:如果某一哥赋值器尚未被回收器扫描过(即赋值器的根还没有被追踪到),或者尽管被扫描过,但是还需要重新扫描
      • golang 插入写屏障的时期,
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值