4.29
Golang中GC回收机制三色标记与混合写屏障
第14讲-总结哔哩哔哩bilibili
三个阶段
gc垃圾回收
早期是
GO1.3 标记清除
之前的标记清除:开始标记找到可达对象,并标记,标记完后清楚未标记的
较长时间的STW,使程序暂停,程序出现卡顿
GO1.5
三色标记法 根据强弱三色不变式 指定了插入写屏障和删除写屏障
插入写屏障 删除写屏障
插入写屏障最后要启用栈上的gc
删除写屏障 回收精度低
白色 灰色 黑色
三色标记最不希望发生的事情:一个白色对象被黑色对象引用(白色对象被黑色对象引用)
灰色对象与它之间的可达关系的白色对象遭到破坏(灰色同时丢了该白色)
同时满足,对象丢失
如果三色标记满足强弱不变式之一,即可保证不丢失对象
开始都是白色,然后从根节点开始遍历所有的对象,把便利到的对象从白色放入灰色
然后遍历灰色,将灰色的引用对象放入灰色,将灰色放入黑色。重复直到灰色对象全部消失
回收所有的白色对象,也就是回收垃圾
也还是需要STW来保护全过程
如果不使用 STW来保护会出现的问题:
一个白色对象被黑色对象引用,白色被挂在黑色下
灰色对象与它之间的可达关系的白色对象遭到破坏(灰色同时丢了该白色)
两个条件同时满足,那么就会出现对象丢失的现象
就会出现合法对象被回收
引入强弱三色不变式
强三色不变式: 强制性不允许黑色对象引用白色对象
弱三色不变时: 黑色对象也可以引用白色对象,白色对象存在其他灰色对象对它的引用,或者可达它的链路上存在灰色对象
如果三色标记满足强弱不变时之一,即可保证不丢失对象
强弱三色标记引申出插入屏障和删除屏障
插入写屏障:当A对象引用B对象的时候,B对象被标记为灰色
不在栈上使用 还会有栈上额外的短时间的暂停 大约需要10-100ms
结束时需要STW来重新扫描栈 可能出现黑色引用白色
删除写屏障:被删除的对象,如果自身为灰色或者白色,都被标记为灰色
保护灰色对象到白色对象的路径不会断