核心解答

在 Go 语言的并发垃圾回收(Concurrent GC)机制中,清理(Sweep)过程本身是并发执行的,不会导致全线停顿(Stop The World, STW

但需要特别注意,在 GC 开始时的 清理终止(Sweep Termination) 阶段是存在 STW 的,该阶段会执行包括“确保上一轮清理工作完成”在内的一系列准备工作。

Go 的 GC 流程主要分为以下几个阶段:

  1. 清理终止阶段(Sweep Termination):为下一轮 GC 做准备,会触发 STW。此阶段会强制清扫上一轮遗留的内存页、开启写屏障、启动后台标记协程等。
  2. 标记阶段(Marking):并发执行,与用户代码并行。
  3. 标记终止阶段(Mark Termination):关闭写屏障,扫描部分残留根对象。此处有第二次 STW
  4. 清理阶段(Sweeping)并发执行。在标记终止结束后,STW 已经解除,清理过程与用户代码并行。

解答思路

理解 Go GC 的演进和各个阶段的行为是回答此题的关键:

  1. 区分阶段性 STW 与并发过程:明确 STW 发生在“状态切换”瞬间(如开启/关闭写屏障、强制同步状态),而耗时最长的标记和清理动作都是并发的。
  2. 清理终止的必要性:解释为什么需要 Sweep Termination。如果允许上一轮清理和这一轮标记同时进行,会导致内存状态的混乱(例如标记了正在被清理的内存)。
  3. 并发设计:Go 自 1.5 版本引入三色标记法后,核心目标就是实现并发 GC。清理阶段由于只涉及将不再使用的内存块放回空闲列表(mspan),不涉及对象引用的修改,因此天然适合并发。

深度解析与面试技巧