Golang——GC机制简要归纳(1.8版本后)

  Golang通过遍历程序的所有对象,发现当前没有被引用的对象,来将这些资源进行GC,在Go1.8版本后的GC机制,主要采用三色标记法+混合写屏障。

  三色用于标记要进行GC的资源对象,分别为:

  白色(当前没有遍历到,或程序没有使用到的对象)

  灰色(当前遍历到的对象)

  黑色(遍历结束,确认程序会使用到的对象)

  STW(Stop The World)Golang在以前版本的GC时,会暂停程序的运行,然后才回收资源,这么做是为了防止程序运行时再引用资源会与GC冲突,但是这么做明显影响了程序的业务运行。  

  三色标记法:从程序引用对象的根集合开始,遍历完程序所有引用到的对象,剩余没有被标记到的白色对象进行GC。

  可能存在的问题——取消了STW,会出现对象丢失的问题:

  (1)黑色对象引用了白色对象。

  (2)灰色对象同时也丢失了这个白色对象。

  这样最终删掉这个白色对象时,导致前一个黑色对象无法继续使用。

  为了防止这种情况的发生,我们可以破坏这两种必要条件,增加遍历过程中的两种限制:

  强三色不变式:强制性不允许黑色对象引用白色对象(破坏条件1)。

  弱三色不变式:允许黑色对象引用白色对象,但是必须保证白色对象要被别的灰色对象引用(破坏条件2)。 

  

  根据以上两种三色不变式,Golang在GC过程中,采用了混合写屏障,完整过程如下:

  1.初始将所有栈上对象全部置黑,新增加的栈对象也置黑。(栈上不启动屏障,只在堆上启动)

  2.扫描过程中,插入的对象置灰,删除的对象也置灰。

  

  

posted @ 2022-03-05 20:11  J0nathan1ei  阅读(630)  评论(0编辑  收藏  举报