Golang各版本的GC详解

go v1.3的标记清除法

  1. 清除的第一步:stw
  2. 将可达对象标记
  3. 删除未被标记对象

在这里插入图片描述

go v1.5三色标记法

  1. 从根节点出发,将下一个节点遍历为灰色,放入灰色集合中
  2. 遍历灰色节点集合,把灰色能到达的节点标记为灰色,把自身标记为黑色,放入黑色集合中
  3. 重复上述流程 …,把最终剩余的白色对象进行清楚

在这里插入图片描述

会出现对象丢失问题,例子如下:

对象2 引用 对象3,对象4 引用 对象3 ——> 对象4 引用 3

在这里插入图片描述

可以在进行gc期间,启动stw,这样就不会出现问题,但是stw有明显的资源浪费。可以通过强弱三色不变式的思路来解决对象丢失问题:

强三色不变式:黑色对象不能引用白色对象

弱三色不变式:黑色对象可以引用白色对象,但是白色对象存在上游对象

对于强三色不变式的实现,通过插入写屏障机制实现(只在栈空间启用):在A对象引用B对象时候,若B对象为白色,就把它标记为灰色。

注意:栈空间不启用插入写屏障,还会造成对象丢失问题,因为栈空间一个黑色对象新创建了一个白色对象时候,若没有插入写屏障,会造成白色对象丢失,

所以在最终准备回收白色前,启动stw,重新扫描一次栈空间,重新标记,避免对象丢失

在这里插入图片描述

对于弱三色不变式的实现,通过删除写屏障实现:在对象A取消对对象B的引用时候,会把B对象标记为灰色。

在这里插入图片描述

上面是通过插入写屏障和删除写屏障来避免对象丢失问题。会有两个问题:

插入写屏障的不足:准备回收白色对象垃圾时候,需要stw

删除写屏障的不足:回收精度低,删除一个对象需要下一轮才能删除

于是go语言就引入了混合写屏障。

go v1.8 三色标记法 + 混合写屏障

  1. GC开始将栈上的对象全部扫描并标记为黑色
  2. GC期间,任何在栈上创建的新对象,均为黑色
  3. 被删除的对象标记为灰色
  4. 被添加的对象标记为灰色

前两步避免了事后的栈空间的stw。后两步结合了删除写屏障和插入写屏障。

相关推荐

  1. Golang 模块版本管理与语义版本控制详解

    2024-03-11 21:24:04       32 阅读
  2. unity中Android版本对应SDK版本

    2024-03-11 21:24:04       39 阅读
  3. Android版本引入重要安全机制介绍

    2024-03-11 21:24:04       34 阅读
  4. MySQL版本间差异以及需要注意事项

    2024-03-11 21:24:04       19 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-11 21:24:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-11 21:24:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-11 21:24:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-11 21:24:04       20 阅读

热门阅读

  1. ms office学习记录11:Excel㈤

    2024-03-11 21:24:04       16 阅读
  2. ChatGPT消息发不出去了?我找到解决方案了

    2024-03-11 21:24:04       43 阅读
  3. Django高级之-forms组件

    2024-03-11 21:24:04       17 阅读
  4. Vue:自动按需导入element-plus图标,动态导入

    2024-03-11 21:24:04       24 阅读
  5. 【Vue】实现 vuex 状态持久化

    2024-03-11 21:24:04       21 阅读
  6. 景安空间不支持指定运行目录tp5

    2024-03-11 21:24:04       21 阅读
  7. 面试题 -- 内存管理

    2024-03-11 21:24:04       21 阅读
  8. Qt + mqtt对接阿里云平台(二)

    2024-03-11 21:24:04       24 阅读
  9. 2023 年 3 月青少年软编等考 C 语言一级真题解析

    2024-03-11 21:24:04       22 阅读