本文基于 Go 1.13。
在某些垃圾回收器算法中,“停止世界”(Stop the World: STW,下同)是跟踪内存使用最重要的阶段,它会停止程序的执行,以扫描内存使用,并添加写障碍。让我们回顾一下它在内部如何工作,以及它可能面临的潜在问题。
停止世界(Stop the world)
停止程序意味着停止所有正在运行的 goroutine。下面是一个执行 STW 的简单程序:
func main() {
runtime.GC()
}
运行垃圾回收器,将触发 STW 两个阶段。
有关垃圾回收器周期的更多信息,建议阅读我的另外一篇文章 “Go:垃圾收集器如何标记内存? ① ”
第一步:抢占所有正在运行的 goroutine:
goroutine 抢占
一旦 goroutine 被抢占,它们将在安全点停止。同时,P 处理器将(正在运行的代码或在空闲列表)被标记为已停止ÿ