随着对go语言的深入学习,逐渐了解到了go的gc实现,晚上关于go gc的发展及过程的文章非常的多,这里我就不继续整了,我就单独总结一下gc的几个知识点吧
一.三色标记法(黑灰白)
1、初始创建对象都为白色
2、从根节点遍历所有对象且置为灰色
3、遍历灰色集合 将灰色对象置为黑色且灰色对象的下级置为灰色。不停的重复这一步直至灰色集合为空
4、删除白色对象
上面就是最原始的三色标记法流程,但是在gc过程中也会有新的对象产生或者关联,就会可能出现无法删除或者无法保护的情况了 这时候就需要写屏障了
二.屏障机制
1.强-弱 三色不变式
禁止黑色对应引用白色对象(强)和 所有被黑色对象引用的白色对象必须被保护(弱)ps 就是白色对象有灰色对象保护,早晚会遍历到
2.插入写屏障
1.5版本实现了这个,主要是黑色对象引入的灰白对象都会变成灰色 满足强三色
3.删除写屏障
有插入就有删除,删除时候如果自身是灰色或者白色的时候就会变成灰色,可以保护灰色到白色的引用不会断 但是会丢失精度,要到下一次gc才能回收了
4.混合写屏障 由于栈空间不好弄钩子也就是不好放入屏障逻辑,所有会有stw一次停下来遍历所有栈空间,这个有点致命,所以出现了混合写屏障
1、GC开始将栈上的对象全部扫描并标记为黑色(之后不再进行第二次重复扫描,无需STW),
2、GC期间,任何在栈上创建的新对象,均为黑色。
3、被删除的对象标记为灰色。
4、被添加的对象标记为灰色。
这样就能全程无stw了 不过在扫描到某个具体的goroutine时候还是会stw对应的栈的且扫描精度会同删除写屏障 有些需要下一次gc才能回收了
1.8以后go 的gc都是由三色标记法+混合屏障了