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.扫描过程中,插入的对象置灰,删除的对象也置灰。