go的GC(标记清理 -> 三色标记发 -> 混合写屏障)

**题目来源:**深信服、腾讯、小米、学而思、Aibee、阿里、字节跳动、滴滴、蚂蚁、快手、猿辅导、Shoppe、哔哩哔哩

答案1:

题解来源: https://studygolang.com/articles/18850?fr=sidebar

  1. 标记清除:
    此算法主要有两个主要的步骤:

    标记(Mark phase)

    清除(Sweep phase)

    第一步,找出不可达的对象,然后做上标记。
    第二步,回收标记好的对象。

    操作非常简单,但是有一点需要额外注意:mark and sweep算法在执行的时候,需要程序暂停!即 stop the world。
    也就是说,这段时间程序会卡在哪儿。故中文翻译成 卡顿.

    标记-清扫(Mark And Sweep)算法存在什么问题?
    标记-清扫(Mark And Sweep)算法这种算法虽然非常的简单,但是还存在一些问题:

    STW,stop the world;让程序暂停,程序出现卡顿。

    标记需要扫描整个heap

    清除数据会产生heap碎片
    这里面最重要的问题就是:mark-and-sweep 算法会暂停整个程序。

  2. 三色并发标记法:
    首先:程序创建的对象都标记为白色。
    gc开始:扫描所有可到达的对象,标记为灰色
    从灰色对象中找到其引用对象标记为灰色,把灰色对象本身标记为黑色
    监视对象中的内存修改,并持续上一步的操作,直到灰色标记的对象不存在
    此时,gc回收白色对象
    最后,将所有黑色对象变为白色,并重复以上所有过程。

  3. 混合写屏障:
    注意:
    当gc进行中时,新创建一个对象. 按照三色标记法的步骤,对象会被标记为白色,这样新生成的对象最后会被清除掉,这样会影响程序逻辑.
    golang引入写屏障机制.可以监控对象的内存修改,并对对象进行重新标记.
    gc一旦开始,无论是创建对象还是对象的引用改变,都会先变为灰色。