Skip to content

Latest commit

 

History

History
14 lines (9 loc) · 1.12 KB

gc.md

File metadata and controls

14 lines (9 loc) · 1.12 KB

go 三色标记垃圾回收算法

  • 白色: 要被回收的对象
  • 黑色:活跃的对象,不存在任何引用外部指针的对象
  • 灰色:活跃对象,存在指向白色对象的指针,灰色也是被扫描的对象

在垃圾收集器开始工作时,程序中不存在任何的黑色对象,垃圾收集的根对象会被标记成灰色,垃圾收集器只会从灰色对象集合中取出对象开始扫描,当灰色集合中不存在任何对象时,标记阶段就会结束。

从灰色的对象中,取出一个标记为黑色,将黑色指向的所有对象都标记为灰色,往复进行,直到灰色完全消失,剩下的就剩下活跃的黑色,以及白色,白色的对象回收掉即可。

为了防止下面这种场景,黑色的指向的是灰色的,但是这个时候,灰色变灰色,它前面的黑色突然指向了一个白色,这个时候这个白色就不能变成灰色了,就会被gc掉,所以说go做了下面的决定:

  • 黑色只能指向灰色,或者黑色
  • 黑色如果指向的有白色,必须是黑色指向的灰色,灰色再指向白色才可以。