Golang中GC(Garbage Collection垃圾回收)浅析

golang GC机制经历了3个过程

一、Go1.3版本的mark and sweep(标记、清除)

        步骤:

                1、锁住整个程序,即STW(stop the world),使整个程序暂停执行;

                2、从程序根节点开始扫描追踪所有能追踪到的引用对象,将其标记;

                3、删除整个程序中没有被标记的对象;

                4、解锁程序,继续让程序执行。

        缺点:

                1、锁程序(STW)将导致程序卡顿;

                2、扫描所有堆,耗时长,且有碎片产生;

        优化思路:

                减少STW时间,将步骤3和4调换,但依然避免不了长时间扫描造成的程序卡顿。

二、Go1.5版本的三色标记法

        三色:

                白、灰、黑

       准备:

                白、灰、黑三个“筐子”,用于记录被标记的对象;

        步骤(不使用STW的情况):

                1、将所有程序中的对象,全部扔进准备好的白色筐子;

                2、从程序根节点出发,走一步,将根节点所能抵达的所有引用对象,标记为灰色,将其从白色筐子拿出来,扔进我们准备好的灰色筐子;

                3、从灰色筐子拿取引用对象,再往下走一步,将能抵达的引用对象标灰,将标灰的对象从白色筐子拿到灰色筐子中,将步骤2中拿到的原来的灰色对象标黑,从灰色箱子扔进黑色箱子;

                4、重复步骤2和3,直到灰色筐子中没有任何对象,此时程序中所有对象只剩下白色和黑色两种,白色认定为无用,直接回收。

        问题1:

                上述步骤不使用stw,可以避免长时间程序暂停卡顿,但有一个致命的BUG!

                在实际程序运行过程中,对象是不断被添加引用和删除引用的,如果出现如下情况:

                (1)一个黑色对象(假设02)在运行途中将要添加了一个还未被扫描到的白色对象(假设15);

                同时!!!!

                (2)一个灰色对象(假设07)原本接下来引用白色对象(15),但此时07将15给抛弃了(删除对15的引用)

                当条件(1)和条件(2)同时发生,白色对象(15)就无法再被扫描到,被错误判断成无用的引用,被垃圾回收掉!

                解决问题1:核心思想:不允许条件(1)和条件(2)同时发生,即要么解决黑色不能直接引用白色对象,要么灰色不能直接抛弃白色对象。

                        1、针对条件(1),引入强三色不变式(插入屏障):黑色对象引用白色对象,强制将白色对象标灰!

                        2、针对条件(2),引入弱三色不变式(删除屏障):灰色对象删除白色对象引用时,强制将白色标灰!

                问题2:

                        上述设计解决了删除有效对象引用的BUG,但将插入\删除屏障用于空间小,数据小的栈空间,效率会很低。

                解决问题2:核心思想:将堆、栈分开处理,堆中使用插入\删除屏障,栈中不使用屏障;

                但扫描完后,栈中可能有确实没用却被保留下来的对象,所以栈中扫描完后需要通过STW暂停一次程序,再扫描一遍,清除全部没用的对象垃圾,此操作耗时10-100ms左右。

                优化方向:如何避免栈中STW?

              

三、Go1.8版本的混合写屏障机制

        1、栈中:

                规则1、栈中不启用任何屏障机制,为了保证栈的效率;

                规则2、一开始将所有能找到的引用标记为黑;

                规则3、新建的任何引用都标记为黑;

                规则4、栈中删除引用对象,直接删除,不做其他操作。

        2、堆中:

                规则1、堆中启用插入、删除屏障机制;

                规则2、新增引用(插入)如为白色,强制为灰;

                规则3、删除引用如为白,强制为灰;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值