首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场

go-GC

原创
作者头像
一只羊羊
修改2025-04-07 18:06:15
修改2025-04-07 18:06:15
1300
举报

三色标记法

三色标记法是指从程序出发,一直寻找可到达的对象,直到无可达对象,标记期间会进行stw,避免标记过程中黑色对象引用白色对象,导致正在使用的对象被清理

  • 所有对象均为白色(a,b,c,d,e,f),a->b->d c->e f
  • 编辑程序可达a,c为灰色
  • 继续a的可达对象为b,则a为黑色,b为灰色,c以此标记,此时a,c为黑色,b和e为灰色
  • 继续灰色变量b和e, 则b和e为黑色,则d为灰色
  • 继续灰色变量d,d后无可达对象,则d也为黑色,故f为白色

传统写屏障

传统写屏障满足强三色不变式,且只对堆对象生效

  • 写屏障只有对堆对象进行插入时会触发写屏障
  • 写屏障对栈对象的下游新增不会触发写屏障,哪怕栈对象下游引用的是堆对象
  • 由于不对栈对象的新增进行标记,故有可能将栈对象下游的堆对象给清理掉,故需要在写屏障结束后再对栈对象进行一次标记(stw),故需要多一次stw

混合写屏障

混合写屏障和写屏障对比会少一次stw,就是对栈最后的一次标记stw,主要是混合写屏障对栈上的可达对象和新增对象都会标记为黑色,故少了一次stw

集齐写屏障和删屏障的优势,堆对象被删除时要等下一轮GC方可被清理,遵从以下几种规则

  • 栈上所有可达对象均标记为黑色
  • 栈上新增对象均为黑色,删除不处理
  • 堆上对象采用三色标记法来标记
  • 堆上新增对象标记为灰色
  • 堆上删除对象标记为灰色

混合写屏障的执行步骤

假设栈上对象为 1->2->3 堆上对象为4->7 6

  • 扫描栈区,根对象可达的对象1,2,3 均标记为黑色,不可达的栈对象声明周期归编译器管,gc不处理也不做标记
  • 扫描堆对象,可知4和7最终为黑色,6为白色(不可达),最终gc清理白色对象

情景一

  • 此时若将栈对象1的下游为堆对象7,第一步将对象7挂在对象1下游,属于栈对象,不做处理,直接挂上去即可
  • 第二步将对象4的下游置空,触发写屏障,将对象7标记为灰色,等下下一轮gc清理

情景二

  • 新增栈对象9,且栈对象9的下游为对象3,且对象2的下游置空 1->2 9->3
  • 新增栈对象9,则对象9被标记为黑色,9的下游是栈对象3,故不做颜色标记处理,直接将9的下游改成3
  • 2的下游被置空,2为栈对象,故同样不做颜色标记处理,直接修改

注意

  • 参考资料:深入理解Go语言

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 三色标记法
  • 传统写屏障
  • 混合写屏障
    • 混合写屏障的执行步骤
    • 情景一
    • 情景二
    • 注意
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档