golang gc (三色标记法+混合写屏障)归纳

        随着对go语言的深入学习,逐渐了解到了go的gc实现,晚上关于go gc的发展及过程的文章非常的多,这里我就不继续整了,我就单独总结一下gc的几个知识点吧

一.三色标记法(黑灰白)

        1、初始创建对象都为白色

        2、从根节点遍历所有对象且置为灰色

        3、遍历灰色集合 将灰色对象置为黑色且灰色对象的下级置为灰色。不停的重复这一步直至灰色集合为空

        4、删除白色对象

上面就是最原始的三色标记法流程,但是在gc过程中也会有新的对象产生或者关联,就会可能出现无法删除或者无法保护的情况了 这时候就需要写屏障了

二.屏障机制

1.强-弱 三色不变式   

        禁止黑色对应引用白色对象(强)和  所有被黑色对象引用的白色对象必须被保护(弱)ps 就是白色对象有灰色对象保护,早晚会遍历到

2.插入写屏障

        1.5版本实现了这个,主要是黑色对象引入的灰白对象都会变成灰色 满足强三色

3.删除写屏障

        有插入就有删除,删除时候如果自身是灰色或者白色的时候就会变成灰色,可以保护灰色到白色的引用不会断 但是会丢失精度,要到下一次gc才能回收了

4.混合写屏障 由于栈空间不好弄钩子也就是不好放入屏障逻辑,所有会有stw一次停下来遍历所有栈空间,这个有点致命,所以出现了混合写屏障

        1、GC开始将栈上的对象全部扫描并标记为黑色(之后不再进行第二次重复扫描,无需STW),

        2、GC期间,任何在栈上创建的新对象,均为黑色。

        3、被删除的对象标记为灰色。

        4、被添加的对象标记为灰色。

这样就能全程无stw了  不过在扫描到某个具体的goroutine时候还是会stw对应的栈的且扫描精度会同删除写屏障   有些需要下一次gc才能回收了

1.8以后go 的gc都是由三色标记法+混合屏障了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值