垃圾回收简称GC, 是释放那些不再被使用的内存空间的过程。换句话说,垃圾回收回去检查哪些对象超出范围并且不会再被引用到,然后它会去释放那些对象占用的内存空间。

我们假设有一个go程序,它的内存情况如下。程序rootset根节点关联着对象1和对象4,而对象1关联着对象2,对象2关联着对象3,对象7引用着对象2;另外一个分支上,对象4引用对象5,对象6处于游离状态。下图展示的就是以上所表述的内存情况。从可达性分析得到,GC应该回收对象6与对象7,那么三色标记法如何识别对象6和对象7呢?

三色标记法是用于寻找程序RootSet所关联的对象出发,只遍历一次,对每一个对象标记颜色,标记结束后,被标记为白色的对象需要释放空间,而被标记为黑色的对象继续保留,一次三色标记法结束后,是不存在标记为灰色的对象的。

如下图所示,第一步我们把所有的对象都标记为白色:
image.png
第二步,把在程序根节点结合RootSet里的对象标记为灰色,如下图所示,标记为灰色的对象1和对象4:
image.png
第三步,遍历标记为灰色的对象,找到关联的对象,并标记为灰色,同时把自己标记为黑色,如下图所示。遍历灰色对象发现,对象1关联着对象2,对象4关联对象5。那么,把对象2和对象5标记为灰色,同时对象1和对象4标记为黑色。
image.png
此时,被标记为灰色的对象是对象2和对象5。第四步,重复第三步,遍历寻找灰色对象所关联的对象,并标记为灰色。

image.png
image.png
还剩对象3,对象6和对象7没处理。我们继续,第五步,我们发现对象3没有关联对象,那么如下图,把对象3标记为黑色

参考

Golang垃圾回收简明教程1—三色标记法