Golang中GC回收机制三色标记与混合写屏障

本文介绍了Golang垃圾回收机制从1.3版本的标记-清除方法到1.5版本的三色标记法,再到1.8版本引入混合写屏障的过程。1.3版本的GC会导致程序暂停(STW),而1.5版本通过三色标记法减少STW,但仍有栈扫描问题。1.8版本的混合写屏障机制进一步优化,几乎消除STW,提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

整理自:Golang中GC回收机制三色标记与混合写屏障

目标

理解Golang中GC垃圾回收机制

Go v1.3

v1.3之前的标记-清除(mark and sweep)方法

步骤:

第一步:暂停业务逻辑,找出不可达的对象和可达的对象;

第二步:开始标记,程序对所有可达的对象加上标记;

第三步:标记完成后,开始清除未标记的对象

第四步:结束暂停,让程序继续跑,然后循环重复这个过程,知道process程序生命周期结束;

缺点:

1.STW (stop the world) 会让程序暂停,程序出现卡顿;

2.标记需要扫描整个heap(堆内存);

3.清除数据会产生heap碎片;

Go v1.5

三色标记法

步骤:

第一步:只要创建的新对象,默认都是标记为“白色”;

第二步:每次GC开始回收,从根节点遍历所有对象,将遍历到的对象从“白色”标记为“灰色”;

第三步:遍历灰色对象集合,将灰色对象引用的引用的对象从白色标记为灰色,之后将此灰色对象放入黑色集合;

第四步:重复第三步,直到灰色区域无对象;

第五步:回收所有白色标记的对象,就是垃圾回收;

如果三色标记法不被STW保护

条件1:一个白色对象被黑色对象引用;

条件2:灰色对象与它有可达关系的白色对象引用关系遭到破坏;

结论:两个条件同时满足,那么就会造成垃圾回收时对象丢失。

强弱三色不变式

强三色不变式:

破坏条件一,强制性的不允许黑色对象引用白色对象;

弱三色不变式:

破坏条件二,黑色可以引用白色对象,但白色对象必须存在灰色对象的引用,或者可达的上游链路上有灰色对象引用。

如果三色标记法满足强弱三色不变式之一,即可保证不丢失对象。

屏障机制

插入屏障

对象被引用时,触发的机制;

具体操作:在A对象引用B对象时,B对象被强制标记为灰色;

满足:强三色不变式,不存在黑色对象引用白色对象的情况了,因为在引用时白色会被强制标记为灰色;

不足:插入屏障只存在于堆对象上,结束时需要重新扫描栈,大约需要10~100ms.

删除屏障

对象被删除时,触发的机制;

具体操作:被删除的对象,如果自身为灰色或白色,那么会被标记为灰色;

满足:弱三色不变式,保护灰色对象到白色对象的引用不会断;

不足:回收精度低,一个对象即使被删除了最后一个指向它的指针,也依然可以活过这一轮,在下一轮GC中才会被清理。

Go v1.8

三色标记法+混合写屏障机制

具体操作:

1.GC开始时,将栈上的对象全部扫描并标记为黑色,之后不再进行重复扫描,无需 STW;

2.GC期间,任何在栈上创建的对象,均标记为黑色;

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

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

总结

Go v1.3版本,普通的标记清除法,整体需要STW,效率较低;

Go v1.5版本,三色标记法,堆空间启用屏障,栈空间不启用,全部扫描后,需要重新扫描一次栈(需要STW),效率普通;

Go v1.8版本后,三色标记法+混合写屏障,栈空间不启动屏障,堆空间启动,几乎不需要STW,整体效率较高;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值