请详细描述 Go 语言垃圾回收(GC)的具体执行流程,包括触发时机、标记阶段、清除阶段以及相关的并发机制。
考察说明
考查候选人对 Go 语言垃圾回收机制的理解深度,包括触发条件、三色标记算法、并发执行方式及流程细节。
回答思路
- 【回答框架 1】Go 语言采用并发三色标记清除算法。GC 流程分为触发、标记、清除三个阶段。触发分为主动触发和被动触发,被动触发主要依据分配堆大小和 CPU 使用率阈值。
- 【回答框架 2】标记阶段使用三色标记法,将对象分为白、灰、黑三种颜色。从根对象开始标记,通过写屏障保证在标记过程中新分配的对象和引用关系的正确性,确保不会漏标或误标。
- 【回答框架 3】标记过程与用户程序并发执行,采用混合写屏障技术减少停顿。标记完成后进入清除阶段,清除阶段同样并发执行,回收未被标记的白色对象。
- 【回答框架 4】整个 GC 过程通过 STW(Stop The World)窗口控制在极短时间内,主要包括标记开始、标记结束和清除开始等关键点,以减少对业务的影响。
- 【关键点 1】Go GC 是并发三色标记清除算法,与用户程序并行执行,STW 时间极短。
- 【关键点 2】触发条件包括堆大小达到阈值和 CPU 使用率低于设定值。
- 【关键点 3】写屏障用于保证并发标记的正确性,混合写屏障是当前实现的关键。
- 【关键点 4】清除阶段并发回收未标记对象,系统根据目标利用率和内存情况调整 GC 频率。
- 【易错点 1】不能简单认为 Go GC 完全无停顿,实际存在多次短暂 STW 窗口。
- 【易错点 2】三色标记中若对象状态转换处理不当会导致漏标,必须依赖写屏障进行保护。