知识卡片
辅助标记背压
内容
(书中 Go 1.5 起沿用至 1.14)并发标记时用户协程仍在分配内存,分配太快会让标记追不上。Go 用”资产池”背压:协程有 gcAssistBytes 额度,额度耗尽且全局资产池不足时须暂停并执行辅助标记,扫描完对应内存才能继续分配,把分配速度与 GC 进度绑定,避免标记被无限拖延。
参考来源
- 位置:《Go语言底层原理剖析》第20章《深入垃圾回收全流程》20.5节《辅助标记》
- 结论依据:原文明确"在并发标记阶段,扫描内存的同时用户协程也不断被分配内存,当用户协程的内存分配速度快到后台标记协程来不及扫描时,GC标记阶段将永远不会结束,从而无法完成完整的GC周期……为了解决这样的问题,引入辅助标记算法",并说明"如果工作协程在分配内存时,既无法从本地资产池也无法从全局资产池获取资产,那么需要停止工作协程,并执行辅助标记协程",因此可以推出"分配过快时分配方被迫参与辅助标记、形成背压"的结论。
- 原始内容:Go 1.5引入了并发标记后,带来了许多新的问题。例如,在并发标记阶段,扫描内存的同时用户协程也不断被分配内存,当用户协程的内存分配速度快到后台标记协程来不及扫描时,GC标记阶段将永远不会结束,从而无法完成完整的GC周期,造成内存泄漏。为了解决这样的问题,引入辅助标记算法……如果工作协程在分配内存时,既无法从本地资产池也无法从全局资产池获取资产,那么需要停止工作协程,并执行辅助标记协程。