go语言中的垃圾回收机制是什么?

提问者:帅平 问题分类:面试刷题
go语言中的垃圾回收机制是什么?
4 个回答
西瓜女皇
西瓜女皇
垃圾回收机制是Go一大特(nan)色(dian)。Go1.3采用标记清除法, Go1.5采用三色标记法,Go1.8采用三色标记法+混合写屏障。
发布于:2个月前 (08-05) IP属地:四川省
爱你的小笨蛋
爱你的小笨蛋
三色标记法:
将对象标记为白色,灰色或黑色。
白色:不确定对象(默认色);黑色:存活对象。灰色:存活对象,子对象待处理。
标记开始时,先将所有对象加入白色集合(需要STW)。首先将根对象标记为灰色,然后将一个对象从灰色集合取出,遍历其子对象,放入灰色集合。同时将取出的对象放入黑色集合,直到灰色集合为空。最后的白色集合对象就是需要清理的对象。
这种方法有一个缺陷,如果对象的引用被用户修改了,那么之前的标记就无效了。因此Go采用了写屏障技术,当对象新增或者更新会将其着色为灰色。
一次完整的GC分为四个阶段:
1、准备标记(需要STW),开启写屏障。
2、开始标记
3、标记结束(STW),关闭写屏障
4、清理(并发)
基于插入写屏障和删除写屏障在结束时需要STW来重新扫描栈,带来性能瓶颈。混合写屏障分为以下四步:
GC开始时,将栈上的全部对象标记为黑色(不需要二次扫描,无需STW);
1、GC期间,任何栈上创建的新对象均为黑色
2、被删除引用的对象标记为灰色
3、被添加引用的对象标记为灰色
4、总而言之就是确保黑色对象不能引用白色对象,这个改进直接使得GC时间从 2s降低到2us。
发布于:2个月前 (08-05) IP属地:四川省
情若相惜
情若相惜
标记清除法:
分为两个阶段:标记和清除
标记阶段:从根对象出发寻找并标记所有存活的对象。
清除阶段:遍历堆中的对象,回收未标记的对象,并加入空闲链表。
缺点是需要暂停程序STW(stop the world)。
发布于:2个月前 (08-05) IP属地:四川省
我来回答