清理终止阶段
暂停程序,所有的处理器在这时会进入安全点(Safe point)
如果当前垃圾收集循环是强制触发的,我们还需要处理还未被清理的内存管理单元
标记阶段
将状态切换至 _GCmark、开启写屏障、用户程序协助(Mutator Assiste)并将根对象入队
恢复执行程序,标记进程和用于协助的用户程序会开始并发标记内存中的对象,写屏障会将被覆盖的指针和新指针都标记成灰色,而所有新创建的对象都会被直接标记成黑色
开始扫描根对象,包括所有 Goroutine 的栈、全局对象以及不在堆中的运行时数据结构,扫描 Goroutine 栈期间会暂停当前处理器
依次处理灰色队列中的对象,将对象标记成黑色并将它们指向的对象标记成灰色
使用分布式的终止算法检查剩余的工作,发现标记阶段完成后进入标记终止阶段
标记终止阶段
暂停程序、将状态切换至 _GCmarktermination 并关闭辅助标记的用户程序
清理处理器上的线程缓存
清理阶段
将状态切换至 _GCoff 开始清理阶段,初始化清理状态并关闭写屏障
恢复用户程序,所有新创建的对象会标记成白色
后台并发清理所有的内存管理单元,当 Goroutine 申请新的内存管理单元时就会触发清理