12. 如果内存分配速度超过了标记清除的速度怎么办?

目前的 Go 实现中,当 GC 触发后,会首先进入并发标记的阶段。并发标记会设置一个标志,并在 mallocgc 调用时进行检查。当存在新的内存分配时,会暂停分配内存过快的那些 goroutine,并将其转去执行一些辅助标记(Mark Assist)的工作,从而达到放缓继续分配、辅助 GC 的标记工作的目的。

编译器会分析用户代码,并在需要分配内存的位置,将申请内存的操作翻译为 mallocgc 调用,而 mallocgc 的实现决定了标记辅助的实现,其伪代码思路如下:

func mallocgc(t typ.Type, size uint64) {
    if enableMarkAssist {
        // 进行标记辅助,此时用户代码没有得到执行
        (...)
    }
    // 执行内存分配
    (...)
}
文档更新时间: 2020-12-30 22:00   作者:kuteng