一. 什么是GC?有什么作用?
GC: garbage collect 垃圾回收, 是一种自动内存管理的机制.
当程序向操作系统申请的内存不在需要的时候, 垃圾回收会自动将其回收供其他代码申请内存的时候进行复用, 或返还给操作系统
二. GOLANG GC生命周期
graph LR
清除终止sweep termination --> 标记mark --> 标记终止mart termination--> 清理sweep
2-1. 清除终止(sweep termination)
- 终止程序(STOP THE WORLD)
- 如果是用户手动调用GC, 会先处理未被清除的内存管理单元
2-2. 标记(mark)
- 将状态改为_GCmark,开启写屏障, 用户程序协助
- 程序恢复运行(START THE WORLD), 使用三色标记算法并发标记内存中的对象, 默认所有对象为白色, 先将根对象(全局变量, goroutine上的栈等)标为黑色, 根对象引用的对象标为灰色.
- 再将灰色对象标为黑色, 灰色对象引用的对象标为灰色, 循环将所有对象上色.
2-3. 标记终止(mark termination)
- 暂停程序(STW), 将状态改为_GCmarktermination, 关闭辅助用户程序
2-4. 清扫(sweep)
- 将状态改为_GCoff, 关闭写屏障
- 恢复程序
- 并发清理内存
三. GC触发时机
3-1. 系统触发
- 周期触发
- 堆内存达到阀值触发
3-2. 手动触发
- runtime.GC函数手动触发