写屏障

Go 在进行三色标记的时候并没有 STW,也就是说,此时的对象还是可以进行修 改。 那么我们考虑一下,下面的情况。

image-20220223215637360

我们在进行三色标记中扫描灰色集合中,扫描到了对象 A,并标记了对象 A 的所有引用,这时候,开始扫描对象 D 的引用,而此时,另一个 goroutine 修改 了 D->E 的引用,变成了如下图所示

image-20220223220130582

这样会不会导致 E 对象就扫描不到了,而被误认为为白色对象,也就是垃圾 写屏障就是为了解决这样的问题,引入写屏障后,在上述步骤后,E 会被认为是存活的,即使后面 E 被 A 对象抛弃,E 会被在下一轮的 GC 中进行回收,这一 轮GC 中是不会对对象 E 进行回收的。

发表评论

后才能评论