go

golang的垃圾回收

golang的垃圾回收算法:三色标记法

Posted by Lerko on August 14, 2020

三色标记法

初始化是对象都是白的

颜色 对应身份
白 可以清除
灰 移动到不可清除前的缓冲区域
黑 不可进行垃圾回收的变量
  1. 所有对象都是白色区域

20200814160653

  1. 确认顶级内存区域,移动到灰色区域

20200814160738

  1. 确认子级内存区域,并将顶级内存区域移动到黑色区域

20200814160709

  1. 将所有有引用的内存移动到black

20200814160726

  1. 清除白色区域

20200814160810

为什么可以异步执行

三色标记法因为多了一个白色的状态来存放不确定的对象,所以可以异步地执行。当然异步执行的代价是可能会造成一些遗漏,因为那些早先被标记为黑色的对象可能目前已经是不可达的了。所以三色标记法是一个 false negative(假阴性)的算法。

除了异步标记的优点,三色标记法掌握了更多当前内存的信息,因此可以更加精确地按需调度,而不用像标记清扫法那样只能定时执行。