Goland GC

Goland GC

  • 引用
  • Go 1.3 mark and sweep 标记法
  • Go 1.5 三色标记法
      • 屏障机制
        • 插入屏障
        • 删除写屏障
        • 总结
  • Go 1.8 混合写屏障(hybrid write barrier)机制
  • 总结

引用

https://zhuanlan.zhihu.com/p/675127867

  • Garbage Collection,缩写为GC,一种内存管理回收的机制

Go 1.3 mark and sweep 标记法

流程:

  1. 暂停程序
  2. 从入口标记所有可达的对象
  3. 删除不可达的对象
  4. 恢复程序
  • 这种方式存在一个STW(stop the world)时间。

Go 1.5 三色标记法

  • 解决上个版本存在STW的问题。
  • 三个颜色:
    白色:尚未访问过
    黑色对象已访问过,而且本对象 引用到 的其他对象 也全部访问过了
    灰色对象已访问过,但是本对象 引用到 的其他对象 尚未全部访问完。全部访问后,会转换为黑色。

流程:

  1. 每次新创建的对象,默认的颜色都是标记为“白色”
    在这里插入图片描述
    上图所示,我们的程序可抵达的内存对象关系如左图所示,右边的标记表,是用来记录目前每个对象的标记颜色分类。这里面需要注意的是,所谓“程序”,则是一些对象的根节点集合。所以我们如果将“程序”展开,会得到类似如下的表现形式,如图所示。

在这里插入图片描述
Root Set根节点集合:程序运行到当前时刻的栈和全局数据区域。

BFS遍历一层,使用两个数组:灰色数组和黑色数组。

  1. 把白色可达的1,4加入灰色。
  2. 灰色遍历后变成黑色,即 1,4变成黑色。
  3. 灰色遍历到的2,7由白转灰。
  4. 反复遍历灰色直至没有灰色。
  5. 回收白色。

但如果GC过程中程序在运行,上述引用关系会实时改变,则此方法会误删白色对象。
在运行时能导致错误GC的场景是:

  1. 白色被黑色所引用
  2. 灰色到白色的引用失效

白色被黑色所引用

屏障机制

谷歌团队引入了强弱三色不变式
强制不允许黑色引用白色
:所有被黑色对象引用的白色对象都处于灰色保护状态

在这里插入图片描述
弱三色不变式强调,黑色对象可以引用白色对象,但是这个白色对象必须存在其他灰色对象对它的引用,或者可达它的链路上游存在灰色对象。 这样实则是黑色对象引用白色对象,白色对象处于一个危险被删除的状态,但是上游灰色对象的引用,可以保护该白色对象,使其安全。

为了遵循上述的两个方式,GC算法使用两种屏障方式:插入屏障删除屏障

插入屏障

具体操作: 改色:A引用B时,B改为灰色。(重新参与到bfs里)
满足: 强三色不变式. (不存在黑色对象引用白色对象的情况了, 因为白色会强制变成灰色)
黑色对象的内存槽有两种位置, 栈和堆. 栈空间的特点是容量小,但是要求相应速度快,因为函数调用弹出频繁使用, 所以“插入屏障”机制,在栈空间的对象操作中不使用. 而仅仅使用在堆空间对象的操作中.

这样可以避免堆中操作出现白色对象误删的情况。至于栈中操作,开启STW确保安全性。

这样此方案可以解决在堆操作不需要开启STW。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

删除写屏障

删除写屏障是指:被删除引用关系的对象,如果自身为灰色或者白色,那么被标记为灰色。这一点其实就是为了满足弱三色不变式。
满足: 弱三色不变式. (保护灰色对象到白色对象的路径不会断)
比如A 此时引用了B对象,但是此时A要删除和对象B的引用关系此时。此时如果B对象是白色对象那么B对象会被置为灰色。还有一种情况就是
A对象之前引用了B对象此时,此时A更换了引用关系引用C也就是A对象和B对象之间的引用关系被删除掉了。此时B对象会被置为灰色。
在这里插入图片描述
此时对象1想要删除和对象5之间的引用关系,此时就会触发删除写屏障。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 正常删除1到5的引用后,GC应该把 2 3 5都回收了。但是因为保护机制,保留了235,在下一轮GC再处理。
总结

至此可以解决堆上新增引用的STW的问题,还有堆和栈上删除引用不需要STW,只需要下一次GC来回收。
还遗留了栈上新建引用导致的STW问题。

Go 1.8 混合写屏障(hybrid write barrier)机制

  • 混合写屏障一开始将栈上对象全部标记为黑色
  • 在GC期间任何在栈上创建的对象均为黑色。
  • 被删除引用的对象均标记为灰色
  • 被添加引用的对象均标记为灰色
  • 栈不开启屏障机制

也就是BFS对栈上对象的初始化总为黑色,运行时的引用关系变化后的子节点总是标记为灰色,参与到下一轮的BFS里。
主要为了满足弱三色不变式。注意混合写屏障是Gc的一种屏障机制,所以只是当程序执行GC的时候,才会触发这种机制。
在这里插入图片描述
GC刚开始所有对象都是白色的,然后第一步我们扫描栈区将栈上的对象全部标记为黑色

在这里插入图片描述

在这里插入图片描述
运行时 1 新建了到7的引用。
在这里插入图片描述
7会被置灰,后续运行时4删除7的引用直接删即可。

在这里插入图片描述
在栈上新增 9,按照规则在栈上创建的对象均为黑色对象。
在这里插入图片描述
新增9到3的引用 直接添加即可。
在这里插入图片描述
2删除3的引用关系,在栈上删除即可。不存在误删

在这里插入图片描述
在这里插入图片描述
新建引用关系10-7,会让7置灰,避免7被删除

在这里插入图片描述
4引用2,2本来就是黑色不影响。

在这里插入图片描述
对象1删除和对象2之间的引用关系直接删了就可以,对象4删除和对象7之间的引用关系此时由于是在堆上所以了触发了这个混合写屏障机制将对象7置为灰色。
下一轮GC会处理 7 6 11.

总结

Go 1.3版本:普通标记清除法,整体过程需要启动STW,效率极低。
Go 1.5版本: 三色标记法, 堆空间启动写屏障,栈空间不启动,全部扫描之后,需要重新扫描一次栈(需要STW),效率普通
Go 1.8版本:三色标记法,混合写屏障机制, 栈空间不启动,堆空间启动。整个过程几乎不需要STW,效率较高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3032506.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

MyBatis-plus(一):快速入门

目录 一、MyBatis-plus 快速入门 1、原理 2、实体类命名规则 3、常见注解 4、主键 id 策略 5、使用 TableField 的常见场景 6、常用配置 二、核心功能 1、条件构造器 2、自定义 SQL 3、IService 接口 一、MyBatis-plus 快速入门 1、原理 MyBatisPlus 通过扫描实体…

如何使用联合体判断一个机器是大端还是小端

如何使用联合体判断一个机器是大端还是小端 #include<iostream> using namespace std; union Checker//联合体中的数据共享内存 {int val;char ch[2]; }; int main() {Checker checker;checker.val 0x1234;if (checker.ch[0] 0x34)//数组中的数据是由低地址往高地址存放…

CCC数字钥匙各版本关系

CCC钥匙规范版本关系 CCC数字钥匙架构Overview

BGP(border gateway protocol)边界网关协议初识篇

BGP它是一种路径矢量协议&#xff0c;用于决定数据包在互联网中的最佳路径。 1、工作原理&#xff1a; 自治系统&#xff08;AS&#xff09;间路由: BGP主要用于连接不同自治系统之间的路由器&#xff0c;其中每个自治系统&#xff08;AS&#xff09;代表一组具有共同路由的网…

AJ65SBT2B-64DA 三菱CC-Link D/A转换模块

AJ65SBT2B-64DA 是将数字值(16位有符号BIN数据)转换为模拟值(电压或电流)的模块。 AJ65SBT2B-64DA参数说明&#xff1a;4通道&#xff1b;输入分辨率0~12000&#xff0c;-12000~12000&#xff0c;-16000~16000&#xff1b;输出DC-10~10V&#xff0c;DC0~20mA&#xff1b;转换速…

引入Minio

前置条件 官网&#xff1a;https://www.minio.org.cn/download.shtml#/kubernetes 命令 # 查看系统上的网络连接和监听端口信息 netstat -tpnl # 检查系统的指定端口占用情况 sudo netstat -tuln | grep 9000systemctl status firewalld # 临时关闭 systemctl stop firewall…

MySQL索引优化(超详细)篇章2--索引调优

目录 1.索引失效状况2.性能分析3.表的索引信息--调整索引顺序4.删除冗余索引5.最佳左前缀法则5.1下面是一个实际的例子来说明这个概念&#xff1a; 6.数据长度和索引长度占用空间比较 1.索引失效状况 MySQL索引失效通常指的是查询语句无法有效地利用索引&#xff0c;而导致全表…

微信登录功能--网站应用

微信开发平台注册https://open.weixin.qq.com/ 账号中心-填写基本资料&#xff08;最好是公司注册&#xff09; 账号中心-开发者资质认证&#xff08;充钱&#xff0c;300&#xff09; 审核通过之后&#xff0c;管理中心-网站应用-创建网站应用&#xff08;AppSecret一定一定…

国内十大免费图床推荐

国内十大免费图床推荐 近期&#xff0c;莫卡乐AI导航站汇总了国内一些出色的图床网站&#xff0c;既有知名大站&#xff0c;也有小众网站&#xff0c;用户的使用体验都非常好&#xff01; 1.路过图床 地址&#xff1a;https://imgse.com/ 我们是国内知名的图床之一&#xf…

Android 如何启用user版本的adb源码分析

通过adb shell中执行getprop persist.sys.usb.config&#xff0c;可以看到系统usb的相关选项&#xff0c;persist.sys.usb.config显示的就是当前系统关于usb选项的系统配置【RK3188Android4.4刚移植的例子】: 全编脚本中make命令会调用build/core/main.mk,在里面可以看到一段…

Ansible入门:解锁IT自动化的神

在当今的IT自动化领域&#xff0c;Ansible无疑是一个无法被忽视的重要角色。其便利性和高效性受到了广大开发者和系统管理员的一致好评&#xff0c;成为了配置管理和应用部署的首选工具。然而&#xff0c;对于一些初学者来说&#xff0c;Ansible的概念和架构可能会显得有些复杂…

微火全域外卖团购服务,引领商家与合伙人变革行业赛道!

在当今的数字化时代&#xff0c;外卖业务正成为越来越多人的日常生活选择。然而&#xff0c;随着市场的日益饱和和竞争的加剧&#xff0c;传统外卖模式已经难以满足商家和消费者的多元化需求。正是在这样的背景下&#xff0c;全域外卖团购业务应运而生&#xff0c;以其独特的模…

山东大学软件学院创新项目实训开发日志——第11周

山东大学软件学院创新项目实训开发日志——第11周 项目名称&#xff1a;ModuFusion Visionary&#xff1a;实现跨模态文本与视觉的相关推荐 -------项目目标&#xff1a; 本项目旨在开发一款跨模态交互式应用&#xff0c;用户可以上传图片或视频&#xff0c;并使用文本、点、…

使用Remix部署智能合约到币安链(Remix的操作介绍 币安链合约的部署) 点赞收藏哦

大家好&#xff0c;我是程序员大猩猩呀。 据我所知&#xff0c;很多人进入币圈之后&#xff0c;想要通过炒币一夜暴富&#xff01;另一部分人呢他们希望自己能创建一个项目&#xff0c;然后发行自己的数字货币然后暴富。 不管是什么方式吧&#xff0c;只要不违法&#xff0c;…

小程序第八章总结

1.比目后端云简介 一个完整的小程序系统, 不但需要前端的展现, 而且需要后端服务器的支撑, 以提供数据服务。 也就是说, 开发一个真正完整的小程序应用, 需要前后端的相互配合。 小程序与远程服务器之间通过&#xff28;&#xff34;&#xff34;&#xff30;&#xff33; 传输…

计算机组成结构—指令和指令格式

目录 一、指令的基本格式 二、指令字长 1. 定长指令字结构 2.变长指令字结构 三、地址码 1.四地址指令 2.三地址指令 3.二地址指令 4.一地址指令 5. 零地址指令 四、操作码 1. 定长操作码指令格式 2. 扩展操作码指令格式 五、指令的操作数类型和操作类型 1. 操作…

基于Python的数据分组技术:将数据按照1, 2, 3规则分为三个列表

目录 一、引言 二、数据分组原理与意义 三、案例分析 四、代码实现与解释 五、对新手友好的解释 六、技术细节与扩展 七、实际应用场景 八、总结 一、引言 在数据处理和分析的广阔领域中&#xff0c;数据分组是一项基础且重要的任务。数据分组通常指的是将数据集中的元…

程序员的归宿。。

大家好&#xff0c;我是瑶琴呀。 相信每个进入职场的人都考虑过自己的职业生涯规划&#xff0c;在不同的年龄段可能面临不同挑战&#xff0c;这点对于 35 的人应该更为感同身受。 对于程序员来说&#xff0c;大部分人的职业道路主要是下面三种&#xff1a;第一条&#xff0c;…

数据序列包分析

基于数据序列包分析各部分的内容及含义&#xff0c;可能会考大题 基于本例分析&#xff0c;每部分含义如下&#xff1a; 时间&#xff08;Time&#xff09;&#xff1a; 时间戳显示了数据包在网络中被捕获的具体时间。在本例中&#xff0c;如"0.000000"表示第一个数据…

【PG数据库】PostgreSQL 日志归档详细操作流程

1.1 日志归档的目的 pg数据库日志归档是将PostgreSQL数据库的日志文件进行归档的过程。 归档的主要目的是为了保留历史数据&#xff0c;确保数据的一致性和完整性&#xff0c;同时为数据恢复提供必要的支持。 pg数据库日志归档的目的包括&#xff1a; 1.数据恢复&#xff1…