当前位置: 首页 > article >正文

Golang GC 三色标记法

三色标记法

Golang GC 会使用三种颜色会对象进行标记。分别为白色、灰色和黑色。白色表示尚未被标记的对象、灰色表示已经追踪但还没标记的对象,黑色表示已经完成标记的对象。黑色表示活跃对象,不会被回收。

以下图所示,演示三色标记法的过程。

第一步: 将所有对象都初始化为白色。

image-20250215212323870

第二步: 遍历根节点,将根节点直接可达的对象,标记为灰色

image-20250215212430279

第三步: 遍历灰色集合,将直接可达的对象标记为灰色,自身标记为黑色。

image-20250215212539686

重复第三个步骤,持续完成所有可能的标记

image-20250215212728267

第四步: 回收白色对象

image-20250215212818927

强三色标记:

插入屏障;针对与堆空间,因为栈空间有各种函数调用会进行压栈操作 这个对性能开销很大,因此只针对与堆空间;主要确定就是栈空间需要进行一次STW 重新扫描一次防止漏扫描;

弱三色标记:

删除写屏障;主要将删除的对象都标记为灰色 也是为了防止漏扫描;主要确定:部分对象再本次扫描中会逃逸 GC精度不高;

混合屏障:

变形弱三色标记;栈空间所有对象都标记为黑色 就放置了栈空间的对象后续需要一次STW重新扫描一次 但是同样存在GC精度不高的问题

并发标记阶段,栈区对象处理

标记阶段,栈上新增对象 9 直接被标记为黑色

因为如果此时新增 9,9 初始化为白色,就会出现漏标。系统需要触发 STW(Stop The World) 来停止程序重新标记,造成较大的性能损失。

image-20250215214032763

并发标记阶段写屏障触发

image-20250215214231772

因为栈区没有写屏障,当对象 9 引用对象 8 时,并不会把对象 8 标记为灰色。

image-20250215214313683

当对象 7 和对象 8 断开引用关系时,触发写屏障,把对象 8 标记为灰色。

image-20250215214431545


http://www.kler.cn/a/547879.html

相关文章:

  • 【算法】【区间和】acwing算法基础 802. 区间和 【有点复杂,但思路简单】
  • Windows环境安装Kafka(集群版)
  • 记使用AScript自动化操作ios苹果手机
  • 运用python制作一个完整的股票分析系统
  • Vue 2 + Vite 项目集成 ESLint 和 Prettier
  • PbootCMS增加可允许上传文件类型,例如webp、mov等文件格式扩展
  • 认识vue-admin
  • AIGC图生视频保姆级教程
  • 为什么Pytorch中实例化模型会直接调用forward方法?
  • “新旗手”三星Galaxy S25系列,再次定义了AI手机的进化方向
  • C#学习之DataGridView控件
  • 【mysql部署】在ubuntu22.04上安装和配置mysql教程
  • 明远智睿核心板在智能家居与工业网关中的应用实践
  • cv2小练习
  • Windows server 2016 无法部署docker问题
  • 网络安全-攻击流程-网络层
  • 大型语言模型训练与优化实战指南(2025最新版)
  • 生成格雷码
  • GoC题解(21) 725.画迷宫(下册第4课)
  • 手机应用的耗电量计算