Loading

golang GC

垃圾回收器,最高占用 cpu25%

历史

Go1.1 STW
Go1.3 Mark STW, Sweep 并行
Go1.5 三色标记法
Go1.8 混合写屏障

STW

stw 就是 stop the wrod,意思就是程序停下来,然后标记所有的对象,然后再将所有不用的对象清除,没啥技术难点,但是性能贼差,也是最好理解
所以缺点就是需要程序停止运行,可能几百毫秒
1.1流程是 开启 stw-标记-删除-关闭 stw
1.3 优化成 开启 stw-标记-关闭 stw-删除(这时候和程序并行了)

三色标记

初始将所有节点置为白色,然后依次遍历 root 节点(全局变量、执行栈)置为黑色,将可达节点置为灰色,然后依次遍历灰色节点,将灰色节点内引用对象置为灰色,将自己置为黑色,最后将白色节点回收

但是如果在标记过程中,从一个已经扫描过的黑色节点引用了一个新的对象,则无法知道,会被标记为白色,最后被清除

强三色不变式

黑色节点不可以引用白色节点

弱三色不变式

黑色节点可以引用白色,但是白色节点的引用路径上有灰色节点

插入写屏障(满足强三色不变式)

在堆上创建新对象时,将插入的对象置为灰色,就不会丢失

删除写屏障(满足弱三色不变式)

当要删除一个对象时,将要删除的对象置为灰色,这样就会保护删除的对象还可能有用被误删除

但是这样又会有两个问题,
一个是只在堆上有插入写屏障和删除写屏障,那么栈空间就需要在扫描后重新 stw,进行一次标记
另一个是删除写屏障情况下会造成一些要回收的节点被置为黑色,到下一次 gc 才能回收

混合写屏障机制

由于上述需要重新扫描栈区的问题,所以 1.8 版本引入了混合写屏障,流程是
开始时将栈上所有的可达对象置为黑色,在 gc 期间所有栈上新建的对象都置为黑色节点,这样就就不会回收
然后 gc 期间所有在堆上的新建、删除对象均置为灰色

参考

[典藏版]Golang三色标记、混合写屏障GC模式图文全分析
Go面试题(六):一文弄懂 Golang GC、三色标记、混合写屏障机制【图文解析GC】

posted @ 2023-11-19 21:43  _小孟同学  阅读(17)  评论(0编辑  收藏  举报