知识卡片
GC循环分阶段
内容
(书中 Go 1.14)Go GC 每轮循环依次经过标记准备(STW、开启写屏障、启动标记协程)、并发标记(后台标记协程与用户协程并行,期间可能触发辅助标记)、标记终止(再次 STW,计算下一次触发阈值)、垃圾清扫(懒清扫,与用户协程并行)四个阶段。每个阶段都在准确性、暂停时间和用户协程吞吐之间取舍;理解阶段边界有助于解释延迟尖刺出现在哪一环。具体阶段划分和写屏障实现是 Go 1.8 之后、本书以 Go 1.14 讲解的版本细节。
结构图:
stateDiagram-v2
[*] --> 标记准备
标记准备 --> 并发标记
并发标记 --> 标记终止
标记终止 --> 并发清扫
并发清扫 --> 进入下一轮
进入下一轮 --> 标记准备
参考来源
- 位置:《Go语言底层原理剖析》第20章《深入垃圾回收全流程》20.1节《垃圾回收循环》
- 结论依据:原文明确"当内存到达了垃圾回收的阈值后,将触发新一轮的垃圾回收。之后会先后经历标记准备阶段、并行标记阶段、标记终止阶段及垃圾清扫阶段。在并行标记阶段引入了辅助标记技术,在垃圾清扫阶段还引入了辅助清扫、系统驻留内存清除技术",因此可以推出GC循环的四阶段顺序及各阶段附带机制,即本卡片结构图的直接依据。
- 原始内容:Go语言的垃圾回收循环大致会经历如图20-1所示的几个阶段。当内存到达了垃圾回收的阈值后,将触发新一轮的垃圾回收。之后会先后经历标记准备阶段、并行标记阶段、标记终止阶段及垃圾清扫阶段。在并行标记阶段引入了辅助标记技术,在垃圾清扫阶段还引入了辅助清扫、系统驻留内存清除技术。