Golang GC垃圾回收

300 阅读1分钟

一. 什么是GC?有什么作用?

GC: garbage collect 垃圾回收, 是一种自动内存管理的机制.

当程序向操作系统申请的内存不在需要的时候, 垃圾回收会自动将其回收供其他代码申请内存的时候进行复用, 或返还给操作系统

二. GOLANG GC生命周期

graph LR
清除终止sweep&nbsptermination --> 标记mark --> 标记终止mart&nbsptermination--> 清理sweep

2-1. 清除终止(sweep termination)

  1. 终止程序(STOP THE WORLD)
  2. 如果是用户手动调用GC, 会先处理未被清除的内存管理单元

2-2. 标记(mark)

  1. 将状态改为_GCmark,开启写屏障, 用户程序协助
  2. 程序恢复运行(START THE WORLD), 使用三色标记算法并发标记内存中的对象, 默认所有对象为白色, 先将根对象(全局变量, goroutine上的栈等)标为黑色, 根对象引用的对象标为灰色.
  3. 再将灰色对象标为黑色, 灰色对象引用的对象标为灰色, 循环将所有对象上色.

2-3. 标记终止(mark termination)

  1. 暂停程序(STW), 将状态改为_GCmarktermination, 关闭辅助用户程序

2-4. 清扫(sweep)

  1. 将状态改为_GCoff, 关闭写屏障
  2. 恢复程序
  3. 并发清理内存

三. GC触发时机

3-1. 系统触发

  • 周期触发
  • 堆内存达到阀值触发

3-2. 手动触发

  • runtime.GC函数手动触发

四. 引用

Go 语言设计与实现