STW 在 go 的哪些阶段发生?了解1.8版本的改进吗?

题目来源:字节跳动

答案1:

  • Golang v1.3之前采用传统采取标记-清除法,需要STW,暂停整个程序的运行。
  • 在v1.5版本中,引入了三色标记法和插入写屏障机制,其中插入写屏障机制只在堆内存中生效。但在标记过程中,最后需要对栈进行STW。
  • Go 在 1.8 的时候为了简化 GC 的流程,同时减少标记终止阶段的重扫成本,将 Dijkstra 插入屏障和 Yuasa 删除屏障进行混合,形成混合写屏障。该屏障提出时的基本思想是:对正在被覆盖的对象进行着色,且如果当前栈未扫描完成,则同样对指针进行着色。