Goland GC

news2024/11/16 7:55:29

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://www.coloradmin.cn/o/1663169.html

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

相关文章

ABAP 直连sqlserver或oracle数据库

1、事务码DBCO,配置链接 2、测试链接:sm38 执行ADBC_TEST_CONNECTION 3、运行时会报驱动找不到的错误,解决方法: S4 HANA连接其他数据库(oracle,sqlserver)

代码审计平台sonarqube的安装及使用

docker搭建代码审计平台sonarqube 一、代码审计关注的质量指标二、静态分析技术分类三、使用sonarqube的目的四、sonarqube流程五、docker快速搭建sonarqube六、sonarqube scanner的安装和使用七、sonarqube对maven项目进行分析八、sonarqube分析报告解析九、代码扫描规则定制十…

mysql--join

Join 两个表都有一个主键索引 id 和一个索引 a,字段 b 上无索引,表 t2 里插入了 1000 行数据,在表 t1 里插入的是 100 行数据 CREATE TABLE t2 (id int(11) NOT NULL,a int(11) DEFAULT NULL,b int(11) DEFAULT NULL,PRIMARY KEY (id),KEY …

图机器学习入门:基本概念介绍

图机器学习(Graph Machine Learning,简称Graph ML)是机器学习的一个分支,专注于利用图形结构的数据。在图形结构中,数据以图的形式表示,其中的节点(或顶点)表示实体,边&a…

【LeetCode算法】28. 找出字符串中第一个匹配项的下标

提示:此文章仅作为本人记录日常学习使用,若有存在错误或者不严谨得地方欢迎指正。 文章目录 一、题目二、思路三、解决方案四、JAVA截取字符串的常用方法4.1 通过subString()截取字符串* 一、题目 给你两个字符串 haystack 和 needle ,请你在…

某大型央企主数据项目实战,上线前后深度对比与解析

数据已成为数字化转型的核心,如何将数据转化为战略资产,是当今企业迫切需要解决的问题。其中主数据作为企业的“黄金数据”,是数据资产管理实践方式的重要切入方法之一。某大型央企成功实施了主数据管理项目,实现了从数据孤岛到一…

寻找最大价值的矿堆 - 矩阵

系列文章目录 文章目录 系列文章目录前言一、题目描述二、输入描述三、输出描述四、Java代码五、测试用例 前言 本人最近再练习算法,所以会发布一些解题思路,希望大家多指教 一、题目描述 给你一个由’0’(空地)、‘1’(银矿)、‘2’(金矿)组成的地图…

揭秘自行车对人体的神奇力量

想象一下,如果有一种魔法,能让你每施展一次就多一个小时的寿命,你会心动吗?这种魔法确实存在,它就是——骑自行车。没错,你没有听错,根据最新的研究数据,“骑行一小时,长…

vue布局设置——使用 el-drawer 打造个性化 Admin 后台布局设置

在前端开发中,我们常常需要为 admin 后台构建灵活且个性化的布局设置。今天,我要分享的是如何利用 el-drawer 来实现这样一个有趣的功能。 首先,我们来看一下主要的设置参数: 1. theme: 用于定义主题,可以根据需求切换…

政安晨:【Keras机器学习示例演绎】(四十二)—— 使用 KerasNLP 和 tf.distribute 进行数据并行训练

目录 简介 导入 基本批量大小和学习率 计算按比例分配的批量大小和学习率 政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在…

电脑文件找回恢复软件分享,3款软件助力数据恢复!

使用电脑时一不小心就删除了重要文件?想找回数据却不知道应该怎么操作?众所周知,电脑的使用已经成为我们工作、学习和生活中不可或缺的工具,但是在操作时误删文件是令很多用户都头疼的问题。 怎么恢复电脑里被删除的文件呢&#…

LabVIEW天然气压缩因子软件设计

LabVIEW天然气压缩因子软件设计 项目背景 天然气作为一种重要的能源,其压缩因子的准确计算对于流量的计量和输送过程的优化具有关键意义。传统的计算方法不仅步骤繁琐,而且难以满足现场快速响应的需求。因此,开发一款既能保证计算精度又便于…

一个开源即时通讯源码

一个开源即时通讯源码 目前已经含服务端、PC、移动端即时通讯解决方案,主要包含以下内容。 服务端简介 不要被客户端迷惑了,真正值钱的是服务端, 服务是采用Java语言开发,基于spring cloud微服务体系开发的一套即时通讯服务端。…

【XR806开发板试用】试用SWD+Jlink调试

XR806开发板,只能使用编写代码,然后通过UART下载,没法在线debug, 效率会差很多,官方没有提供这一方面的资料。 先查CPU, 官方介绍是arm-china的MC1,通过armv8 Architecture refenence manual资料…

linux打包流程

因为linux有俩个python版本,我们需要切换到python3这个版本,默认是python 2.7 alias pythonpython3 切换到python3 再次执行:python -V 显示出python的版本了,然后查看pip的配置,我们打包里面需要的第三方需要放到pip…

使用IDA自带python patch的一道例题

首先看见就是迷宫 迷宫解出的路径,放在zip的文件可以得到一个硬编码 然后在原程序中,有一处很离谱 这个debugbreak就是IDA分析错误导致的 我们点进去发现里面全是nop 然后我们把我们得到的硬编码放在010里面,再用IDA打开 重新编译看汇编 你…

高性能运营级流媒体服务框架:支持多协议互转 | 开源日报 No.250

ZLMediaKit/ZLMediaKit Stars: 12.6k License: NOASSERTION ZLMediaKit 是一个基于 C11 的高性能运营级流媒体服务框架。 使用 C11 开发,避免裸指针,代码稳定可靠,性能优越。支持多种协议 (RTSP/RTMP/HLS/HTTP-FLV/WebSocket-FLV/GB28181 等…

JavaEE之线程(3)_线程的开始、中断、等待、休眠线程、线程的状态

前言 在本栏的上一节(https://blog.csdn.net/2301_80653026/article/details/138500558),我们重点讲解了五种不同的创建线程的方式,我们还介绍了Tread类的常见构造方法和常见属性,在这一节中我们将会继续介绍Tread类。…

5/11后面部分:+顺序排序+元素交换+计算每门课程的各种成绩+存放规律的数据 注意:一味的复制肯定要出问题,第2个的最后一部分有修改,注意观察

目录 第一个已经输出过一次: 第二个: 编程实现:程序功能是用起泡法对数组中n个元素按从大到小的顺序进行排序。 ​编辑的确出现了一些问题哦: ​编辑目前是可以运行,但AI不给我们通过: 最后还是我的代码获胜&#x…

苹果电脑怎么安装crossover 如何在Mac系统中安装CrossOver CrossOver Mac软件安装说明

很多Mac的新用户在使用电脑的过程中,常常会遇到很多应用软件不兼容的情况。加上自己以前一直都是用Windows系统,总觉得Mac系统用得很难上手。 其实,用户可以在Mac上安装CrossOver,它支持用户在Mac上运行Windows软件,例…