垃圾回收 GC

垃圾回收 GC #

Go 实现的垃圾回收器是无分代(对象没有代际之分)、 不整理(回收过程中不对对象进行移动与整理)、并发(与用户代码并发执行)的三色标记清扫算法。

Go 运行时的垃圾回收器主要包含五个阶段:

阶段 说明 赋值器状态
清扫终止 为下一个阶段的并发标记做准备工作,启动写屏障 STW
标记 与赋值器并发执行,写屏障处于开启状态 并发
标记终止 保证一个周期内标记任务完成,停止写屏障 STW
内存清扫 将需要回收的内存归还到堆中,写屏障处于关闭状态 并发
内存归还 将过多的内存归还给操作系统,写屏障处于关闭状态 并发

在每次 GC 开始前,所有的 P(Processor) 都需要进入安全点(safe point)。

三色标记清扫算法 #

image

  • 白色对象(可能死亡):未被回收器访问到的对象。在回收开始阶段,所有对象均为白色,当回收结束后,白色对象均不可达。
  • 灰色对象(波面):已被回收器访问到的对象,但回收器需要对其中的一个或多个指针进行扫描,因为他们可能还指向白色对象。
  • 黑色对象(确定存活):已被回收器访问到的对象,其中所有字段都已被扫描,黑色对象中任何一个指针都不可能直接指向白色对象。

References #