Go-通俗易懂垃圾回收及运行过程
Go 的垃圾回收(GC)就像一个自动的“内存清洁工”,它会自动回收程序不再使用的内存空间,避免内存泄漏。整个过程分为 标记存活对象 → 清除垃圾对象 两个核心步骤,并采用 三色标记法 + 并发处理 实现高效回收。
核心原理:三色标记法(Tri-color Marking)
想象内存中的对象被标记为三种颜色:
- 白色:待检查对象(初始状态)
- 灰色:已扫描但引用的对象未检查完
- 黑色:已扫描且所有引用对象也完成检查(存活对象)
工作流程(分4步)
-
STW 初始标记(暂停极短)
- 暂停所有程序(Stop The World)
- 快速标记根对象(全局变量、栈变量等)为灰色
- ⏱️ 耗时:通常 < 1ms
-
并发标记(与程序并行运行)
- 程序恢复运行
- GC 协程逐步处理灰色队列:
- 将灰色对象引用的白色对象标记为灰色
- 当前对象标记为黑色
- 关键:通过写屏障(Write Barrier) 监控内存修改,确保数据一致性
-
STW 标记终止(短暂暂停)
- 再次暂停程序
- 完成最后标记
- 确认所有灰色对象已处理完
- ⏱️ 耗时:通常 1~10ms
-
并发清除(与程序并行)
- 程序恢复运行
- 回收所有白色对象(未被标记的垃圾)
- 黑色对象重置为白色(下一轮准备)