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

Go语言中GC(垃圾回收回收机制)三色标记与混合写屏障

5、Golang三色标记混合写屏障GC模式全分析 (yuque.com)

第1讲-课程目标_哔哩哔哩_bilibili

Golang三色标记+GC混合写屏障

Go V1.3之前的标记清除(mark and sweep)

垃圾回收、内存管理、自动适放、三色标记法、STW (stop the world)

图的遍历?可达性分析

此时第一步为STW暂停(让大家都先别干活了)将1-2-3 4-7等五个可达对象坐上标记,此时没有被标记的对象说明程序是不需要它的

不可达的就会被删除。

标记清除法的缺点

1:让程序暂停,程序出现卡顿(重要问题,影响业务)

2:标记需要扫描整个heap,时间复杂度高

3:清除数据辉产生heap碎片

Go V1.5三色标记法(白灰黑)

尝试采用新的标记模式来替代清除标记法

1、程序起初创建,全部标记为白色,将所有对象放到被色集合

2、遍历Root Set(非递归遍历只遍历一次),得到灰色节点

遍历灰色标记表,将可达的对象从白色标记为灰色,遍历之后的灰色,标记为黑色

之后再重复上一步,直到灰色标记表中无任何对象

在之后就收集所有白色对象(垃圾)

其本质就是利用队列进行bfs算法,标记所有可达对象

三色标记法中无STW问题?

如果三色标记法中不启动stw情况

然后与此同时,对象2将指向对象3的指针p移除,对象3就被挂在了已经扫描完成的黑色的对象4下,但对象4此时已经在黑色标记表中了

此时的对象3有可能会被垃圾回收掉

所以三色标记法最不希望被发生的事:白色对象被黑色对象引用。条件二:灰色对象丢失那个白色对象的可达关系

两个条件同时满足时,就会出现对象丢失现象!

所以想避免最简单的方式就是STW,STW过程有明显的资源浪费,对所有用户程序都有很大影响。

如何能在保证对象不丢失的情况尽可能的提高GC效率,减少STW时间呢?

但是不用stw所以就避免两个条件同时满足,破坏他们同时成立

1、强三色不变式

强制性的不允许黑色对象引用白色对象

2、弱三色不变式

黑色对象可以引用白色对象,但是前提是白色对象存在其他灰色对象对它的引用,或则可达它的链路上游存在灰色对象

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

插入写屏障和删除写屏障

在程序的执行过程中,额外的添加一条判断机制 例如:Hook、回调、handler

插入屏障:对象被引用时 触发的机制

删除屏障:对象被删除的时候 触发的机制

插入屏障 

堆中触发插入屏障

循环操作后直到没有灰色标记后,在准备回收白色前,重新扫描一下栈空间。此时加STW暂停保护栈,防止外界干扰(有新的白色被黑色添加)

之后再进行清除

插入屏障的不足:结束时需要STW来重新扫描栈,大约需要10~100ms

删除屏障

这样有可能会出现当对象1删除对象5的时候,把5转换成灰色,有可能会出现,5-2-3本来应该被删除的却变为了黑色对象,所以5-2-3会多活过一轮,在下一轮GC中会被清理掉

回收精度低,一个对象即使被删除了最后一个值向它的指针也依旧可以活过这一轮,在下一轮GC中被清理掉

Go V1.8基于三色标记法的混合写屏障机制

满足:变形的若三色不变式。(结合了插入、删除写屏障两者的优点)

可以达到被移走的对象是被灰色保护的。(弱三色) 和新加入的下游对象标记灰色(强三色)

注意:1是将栈上所有可达对象标为黑色 (它的特点是GC开始的时候优先扫描栈 )栈为了添加效率是不启用屏障的,堆会启用屏障

总结

GoV1.3- 普通标记清除法,整体过程需要启动STW,效率极低。

GoV1.5- 三色标记法, 堆空间启动写屏障,栈空间不启动,全部扫描之后,需要重新扫描一次栈(需要STW),效率普通

GoV1.8-三色标记法,混合写屏障机制, 栈空间不启动,堆空间启动。整个过程几乎不需要STW,效率较高。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 智能手术新时代:Apple Vision Pro在医疗领域的突破性应用
  • 【计算机网络】学习指南及导论
  • 每日练习,不要放弃
  • Java程序打印日志
  • 怎么找抖音视频素材?下载抖音的素材视频网站分享给你
  • Python实现音频均衡和降噪
  • 服务端正常启动了,但是客户端请求不到
  • Go 1.19.4 函数-Day 08
  • 大数据基础:Doris重点架构原理
  • [ACM独立出版] 2024年虚拟现实、图像和信号处理国际学术会议(VRISP 2024,8月2日-4)
  • 【简历】惠州某二本学院:前端简历指导,秋招面试通过率为0
  • SEO:6个避免被搜索引擎惩罚的策略-华媒舍
  • 初学Python必须知道的14个强大单行代码
  • FPGA之术语
  • vault安装手册
  • dva中组件的懒加载
  • Flex布局到底解决了什么问题
  • Golang-长连接-状态推送
  • JavaScript 奇技淫巧
  • JavaScript设计模式之工厂模式
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • Python学习笔记 字符串拼接
  • React Native移动开发实战-3-实现页面间的数据传递
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 分享一份非常强势的Android面试题
  • 构建二叉树进行数值数组的去重及优化
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 基于游标的分页接口实现
  • 记一次删除Git记录中的大文件的过程
  • 码农张的Bug人生 - 见面之礼
  • 前端知识点整理(待续)
  • 使用SAX解析XML
  • 微信小程序:实现悬浮返回和分享按钮
  • 小程序测试方案初探
  • 一个SAP顾问在美国的这些年
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 整理一些计算机基础知识!
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • ###C语言程序设计-----C语言学习(3)#
  • #include
  • #systemverilog# 之 event region 和 timeslot 仿真调度(十)高层次视角看仿真调度事件的发生
  • (0)Nginx 功能特性
  • (2024,Flag-DiT,文本引导的多模态生成,SR,统一的标记化,RoPE、RMSNorm 和流匹配)Lumina-T2X
  • (2024,LoRA,全量微调,低秩,强正则化,缓解遗忘,多样性)LoRA 学习更少,遗忘更少
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第1节 (全局数据、栈和堆)
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (六)Hibernate的二级缓存
  • (三十五)大数据实战——Superset可视化平台搭建
  • (学习日记)2024.02.29:UCOSIII第二节
  • (转)重识new
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)