golang垃圾回收

4.29

Golang中GC回收机制三色标记与混合写屏障

第14讲-总结哔哩哔哩bilibili

三个阶段

gc垃圾回收

早期是

GO1.3 标记清除 

之前的标记清除:开始标记找到可达对象,并标记,标记完后清楚未标记的

较长时间的STW,使程序暂停,程序出现卡顿

GO1.5 

三色标记法 根据强弱三色不变式 指定了插入写屏障和删除写屏障

插入写屏障 删除写屏障

插入写屏障最后要启用栈上的gc

删除写屏障 回收精度低

白色 灰色 黑色

三色标记最不希望发生的事情:一个白色对象被黑色对象引用(白色对象被黑色对象引用)

灰色对象与它之间的可达关系的白色对象遭到破坏(灰色同时丢了该白色)

同时满足,对象丢失

如果三色标记满足强弱不变式之一,即可保证不丢失对象

开始都是白色,然后从根节点开始遍历所有的对象,把便利到的对象从白色放入灰色

然后遍历灰色,将灰色的引用对象放入灰色,将灰色放入黑色。重复直到灰色对象全部消失

回收所有的白色对象,也就是回收垃圾

也还是需要STW来保护全过程

如果不使用 STW来保护会出现的问题:

  • 一个白色对象被黑色对象引用,白色被挂在黑色下

  • 灰色对象与它之间的可达关系的白色对象遭到破坏(灰色同时丢了该白色)

  • 两个条件同时满足,那么就会出现对象丢失的现象

就会出现合法对象被回收

引入强弱三色不变式

强三色不变式: 强制性不允许黑色对象引用白色对象

弱三色不变时: 黑色对象也可以引用白色对象,白色对象存在其他灰色对象对它的引用,或者可达它的链路上存在灰色对象

如果三色标记满足强弱不变时之一,即可保证不丢失对象

强弱三色标记引申出插入屏障和删除屏障

插入写屏障:当A对象引用B对象的时候,B对象被标记为灰色

不在栈上使用 还会有栈上额外的短时间的暂停 大约需要10-100ms

结束时需要STW来重新扫描栈 可能出现黑色引用白色

删除写屏障:被删除的对象,如果自身为灰色或者白色,都被标记为灰色

保护灰色对象到白色对象的路径不会断

回收精度低

GO V1.8三色标记法+混合写屏障机制

具体操作: GC开始将栈上的对象全部扫描并标记为黑色

GC期间任何在栈上创建的新对象,均为黑色

被删除的对象标记为灰色

被添加对象标记为灰色

变形的弱三色不变式(结合两者优点)

混合写屏障:目的不再使用STW

混合写屏障的四种情况:

  • 对象被一个栈对象引用,被堆对象删除 解决方法:混合写屏障中:gc期间删除的对象标记为灰色

  • 对象被一个栈对象删除引用,成为另一个栈对象的下游 解决:弱三色不变式,栈上没有屏障,直接进行操作即可

  • 对象被一个堆对象删除引用,成为另一个堆对象的下游 解决:被删除的对象标记为灰色

  • 对象从一个栈对象删除引用,成为另一个堆对象的下游

混合写屏障最后记住四句话:

  • GC开始将栈上的对象全部扫描并标记为黑色(无需STW)

  • GC期间,任何在栈上创建的新对象,均为黑色

  • 被删除的对象标记为灰色

  • 被添加的对象标记为灰色

总结视频每次复习的时候看一遍

第14讲-总结哔哩哔哩bilibili

相关推荐
维克兜率天1 分钟前
【维克】统计套利:寻找市场的“定价误差“
人工智能·python·算法
秋饼9 分钟前
Claude Haiku 5.5 + Spring AI 2.0 企业级低成本高并发 AI Agent 实战:子智能体分工、成本熔断与百万上下文落地
java·ai·技术分享·后端开发
aqiu11111112 分钟前
【C++算法打怪专栏】LeetCode 1. 两数之和(哈希表解法总结)
c++·算法·leetcode
楚识科技21 分钟前
票据 OCR 识别技术深度解析:从算法原理到企业级落地实现
算法·ocr
longlongzihan22 分钟前
LeetCode 25. K 个一组翻转链表 (迭代+分组反转法)
算法·leetcode·链表
xuxigifxfh23 分钟前
牛客:BISHI8 大整数哈希
java·算法·哈希算法
涉密IT资质笔记26 分钟前
涉密资质投入产出分析模型:时间成本、四块成本构成与 ROI 决策框架
java·开发语言·算法
木井巳28 分钟前
【BFS 解决拓扑排序】火星词典
java·算法·leetcode·广度优先·宽度优先·图搜索算法
霸道流氓气质29 分钟前
Java调用StableDiffusion/ComfyUI图像生成:DAG工作流编排、WebSocket实时进度与Flux模型集成的生产级实战
java·websocket·stable diffusion
北风toto39 分钟前
KMP 算法详解:从暴力匹配到 O(n+m) 的字符串搜索
java·开发语言·算法