浅谈GC机制-三色标记和混合写屏障
标记清除法
stw(stop the world):暂停所有goroutine,扫描出可达与不可达对象,进行回收
三色标记法
不暂停,并发扫描,从根节点出发,扫描过对象的为黑,下一个可达对象为灰,接下来每一轮从灰节点出发,直到灰节点全部扫描完,只剩下黑和白,回收白色
如果三⾊标记法不被STW保护:
可能会出现白色对象3被黑色对象4引用后,原来引用它的灰色对象2同时删除对3的引用,由于不会再次扫描黑色4,故可达对象3会被误判为不可达而被回收
因此,三色标记法在全部扫描完毕后需要STW重新扫描一遍
对象丢失条件:
条件1: ⼀个⽩⾊对象被⿊⾊对象引⽤ (⽩⾊被挂在⿊⾊下)
条件2: 灰⾊对象与它之间的可达关系的⽩⾊对象遭到破坏 (灰⾊同时丢了该⽩⾊)
两个条件同时满⾜,那么就会出现对象丢失的现象
混合写屏障
结合了插入写屏障和删除写屏障,为解决并发扫描下的对象丢失问题,只需要破坏其中一个条件:
1.进行GC时将栈上所有对象变为黑色
2.栈上对象不触发插入和删除屏障
3.堆上,新插入的对象变为灰色
4.堆上,被删除引用的对象变为灰色