golang 三色标记法

三色标记法为什么要 STW

image-20211016124511581

强三色不变性

  • 强制性 不允许黑色引用白色对象 【读写屏障,runtime复制判断】

image-20211016124955617

弱三色不变性

  • 黑色可以引用白色, 白色对象存在其他灰色对象的应用, 或者其他可以达到它的链路上游存在 灰色对象。

image-20211016124711084

满足强弱之一,就可以保证对象不丢失

插入写屏障

额外的判断机制

  • hook
  • 回调
  • handler

3 删除写屏障

删除屏障技术,又称基于起始快照的屏障。其思想是:

当白色或灰色的对象的引用被删除时,将白色对象变为灰色。

https://gitee.com/thepoy/image-bed/raw/master/cnblogs/md/1617091911960.svg

2 插入写屏障

在对象 A 引用对象 C 的时候,如果对象 C 是白色,就将对象 C 标记为灰色,其他情况则保持不变。

https://gitee.com/thepoy/image-bed/raw/master/cnblogs/md/1617091922342.svg

插入写屏弹是一种相对保守的屏障技术,它会将有存活可能的对象都标记为灰色以满足强三色不变式

在上图所示的垃圾回收过程中,实际上不再存活的的对象 BB 也保留到了最后,没有被回收。如果在第二步时再指 AA 到 CC 的指针指向 BB ,虽然 CC 没有被任何对象引用,但其依然是灰色,不会被回收,只有在下次 GC 时才会被回收。