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

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

相关文章:

  • 多维度健康养生指南
  • 【计算机网络】网络层数据包(Packet)格式
  • 全方位养生指南:打造健康生活蓝图
  • vue-plugin-hiprint (vue2
  • 文本表示方法
  • 什么是FCC认证
  • React echarts柱状图点击某个柱子跳转页面
  • QxOrm生成json
  • Django 创建表时 “__str__ ”方法的使用
  • buu-ciscn_2019_c_1-好久不见36
  • SpringBoot整合Email 邮件发送详解
  • Python经典游戏:植物大战僵尸(附源码!)
  • mac 意外退出移动硬盘后再次插入移动硬盘不显示怎么办
  • springboot整合modbus实现通讯
  • github用户名密码登陆失效了
  • SolidWorks速成教程P3-7【零件 | 第七节】——3D设计打印手机支架+草图文本草图图片材质与质量属性测量
  • TypeScript 面试题
  • 直线导轨尺寸参数
  • 在Autonomous DB中创建训练数据集
  • 机试刷题_数组中出现次数超过一半的数字【python】
  • 俄方代表团抵达土耳其,俄乌直接谈判有望于当地时间上午重启
  • 全国人大常委会今年将初次审议检察公益诉讼法
  • 秘鲁总统任命前司法部长阿拉纳为新总理
  • 马上评|让查重回归促进学术规范的本意
  • 来沪一个月几乎未花住宿钱,女子虚构卫生问题屡薅酒店羊毛被刑拘
  • 独行侠以1.8%概率获得状元签,NBA原来真的有剧本?