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 标记法
流程:
- 暂停程序
- 从入口标记所有可达的对象
- 删除不可达的对象
- 恢复程序
- 这种方式存在一个STW(stop the world)时间。
Go 1.5 三色标记法
- 解决上个版本存在STW的问题。
- 三个颜色:
白色:尚未访问过
黑色对象已访问过,而且本对象 引用到 的其他对象 也全部访问过了
灰色对象已访问过,但是本对象 引用到 的其他对象 尚未全部访问完。全部访问后,会转换为黑色。
流程:
- 每次新创建的对象,默认的颜色都是标记为“白色”

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

Root Set根节点集合:程序运行到当前时刻的栈和全局数据区域。
BFS遍历一层,使用两个数组:灰色数组和黑色数组。
- 把白色可达的1,4加入灰色。
- 灰色遍历后变成黑色,即 1,4变成黑色。
- 灰色遍历到的2,7由白转灰。
- 反复遍历灰色直至没有灰色。
- 回收白色。
但如果GC过程中程序在运行,上述引用关系会实时改变,则此方法会误删白色对象。
在运行时能导致错误GC的场景是:
- 白色被黑色所引用
- 灰色到白色的引用失效

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

弱三色不变式强调,黑色对象可以引用白色对象,但是这个白色对象必须存在其他灰色对象对它的引用,或者可达它的链路上游存在灰色对象。 这样实则是黑色对象引用白色对象,白色对象处于一个危险被删除的状态,但是上游灰色对象的引用,可以保护该白色对象,使其安全。
为了遵循上述的两个方式,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,效率较高。
相关文章:
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,一种内存管理回收的机制…...
【SRC实战】合成类小游戏外挂漏洞
挖个洞先 https://mp.weixin.qq.com/s/ZnaRn222xJU0MQxWoRaiJg “以下漏洞均为实验靶场,如有雷同,纯属巧合” 合成类小游戏三个特点: 1、一关比一关难,可以参考“羊了个羊” 2、无限关卡无限奖励,可以参考“消灭星星…...
【牛客】SQL206 获取每个部门中当前员工薪水最高的相关信息
1、描述 有一个员工表dept_emp简况如下: 有一个薪水表salaries简况如下: 获取每个部门中当前员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary,按照部门编号dept_no升序排列,以上例子输出如下: 2、题目…...
2024年最新趋势跨境电商平台开发需了解的新技术
随着数字化技术的不断演进和全球市场的日益融合,跨境电商平台开发将面临前所未有的挑战和机遇。为了更好地适应并引领这一发展,开发者需要密切关注2024年最新的技术趋势,以确保他们的平台能够在竞争激烈的市场中脱颖而出。本文将对跨境电商平…...
Mac 查看jdk版本
$ /usr/libexec/java_home -VMatching Java Virtual Machines (1): 1.8.0_232 (x86_64) “AdoptOpenJDK” - “AdoptOpenJDK 8” /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home...
C++面向对象学习笔记五
本文主要讲解运算符重载,由于白鳯大佬没有具体讲解,所以本文自行补充了运算符重载的相关知识 目录 文章目录 前言 运算符重载 加号运算符重载 左移运算符重载 递增运算符重载 总结 前言 本文主要对于运算符重载进行探讨,分别对于成员函数重…...
7-Zip 的使用技巧
7-Zip 是一款功能强大的压缩软件,它提供了多种使用技巧来帮助用户更高效地管理文件。以下是一些7-Zip的使用技巧: 1. 压缩文件:用户可以通过7-Zip将文件或文件夹压缩成.7z或其他支持的格式,以节省空间。 2. 解压文件:…...
德国储能项目锂电池储能集装箱突发火灾:安全挑战再引关注
2024年4月27日,德国尼尔莫尔商业区的一起锂电池储能集装箱火灾事件引起了全球关注。这起事故不仅导致两名消防员在救援过程中受伤,更暴露了储能系统在安全领域亟待解决的重要问题。 根据德国消防队的出警记录,火灾发生在晚上9点前不久。消防人…...
FFmpeg常用API与示例(二)—— 解封装与转封装
封装层 封装格式(container format)可以看作是编码流(音频流、视频流等)数据的一层外壳,将编码后的数据存储于此封装格式的文件之内。 封装又称容器,容器的称法更为形象,所谓容器,就是存放内容的器具,饮料是内容&…...
笨方法自学python(一)
我觉得python和c语言有很多相似之处,如果有c语言基础的话学习python也不是很难。这一系列主要是学习例题来学习python;我用的python版本是3.12 代码编辑器我用的是notepad,运行py程序用cmd 现在开始写第一个程序: print ("…...
centos7.9升级4.19内核
centos默认的内核版本是3.10 通过命令 uname -a 输出系统的详细信息 在部署k8s集群时使用默认的3.10版本的内核,容易出各种奇奇怪怪的问题、可以理解为docker和k8s与该内核版本不兼容,所以在部署k8s集群时,务必要升级内核,这里…...
神经网络模型与前向传播函数
1.概念 在神经网络中,模型和前向传播函数是紧密相关的概念。模型定义了网络的结构,而前向传播函数描述了数据通过网络的流动方式。以下是这两个概念的详细解释: 1.1 神经网络模型 神经网络模型是指构成神经网络的层、权重、偏置和连接的集…...
跟我学C++中级篇——内联补遗
一、内联引出的问题 在将一个内联变量定义到编译单元时,然后再按正常的方式使用时,编译会报一个错误“odr-used”。ODR,One Definition Rule,单一定义规则。在C/C程序中,变量的定义只能有一处,至于ODR的规…...
SLAM 面试题
持续完善 SLAM的基本概念和组成部分 描述一下什么是SLAM以及它的基本任务。 SLAM系统主要由哪些部分组成?SLAM的类型和算法 请解释滤波器SLAM(如粒子滤波)和图优化SLAM(如Google的Cartographer)之间的区别。 你如何区…...
csapp proxy lab part 1
host, hub, 路由器,和 交换机 当手机连接到局域网中时,它需要找到网络中的交换机(Switch)。这通常是通过 DHCP(动态主机配置协议)完成的。DHCP服务器负责向手机分配IP地址、子网掩码、网关地址等网络配置信…...
TCP三次握手四次挥手 UDP
TCP是面向链接的协议,而UDP是无连接的协议 TCP的三次握手 三次传输过程是纯粹的不涉及数据,三次握手的几个数据包中不包含数据内容。它的应用层,数据部分是空的,只是TCP实现会话建立,点到点的连接 TCP的四次挥手 第四…...
哈希表(unordered_set、unordered_map)
文章目录 一、unordered_set、unordered_map的介绍二、哈希表的建立方法2.1闭散列2.2开散列(哈希桶/拉链法) 三、闭散列代码(除留余数法)四、开散列代码(拉链法/哈希桶) 一、unordered_set、unordered_map的…...
Docker 加持的安卓手机:随身携带的知识库(一)
这篇文章聊聊,如何借助 Docker ,尝试将一台五年前的手机,构建成一个随身携带的、本地化的知识库。 写在前面 本篇文章,我使用了一台去年从二手平台购入的五年前的手机,K20 Pro。 为了让它能够稳定持续的运行…...
本地连接服务器Jupyter【简略版】
首先需要在你的服务器激活conda虚拟环境: 进入虚拟环境后使用conda install jupyter命令安装jupyter: 安装成功后先不要着急打开,因为需要设置密码,使用jupyter notebook password命令输入自己进入jupyter的密码: …...
sql 注入 1
当前在email表 security库 查到user表 1、第一步,知道对方goods表有几列(email 2 列 good 三列,查的时候列必须得一样才可以查,所以创建个临时表,select 123 ) 但是你无法知道对方goods表有多少列 用order …...
MongoDB时间戳转换实战:从数字到标准时间格式的完整指南
1. MongoDB时间戳转换的核心概念 第一次接触MongoDB时间戳转换时,我也被各种时间格式搞得晕头转向。简单来说,MongoDB中的时间戳主要有三种存储形式:数字类型(如1655448286502)、字符串类型(如"165544…...
RTX3090也能跑!Qwen2.5-Omni本地部署避坑指南(含vLLM配置)
RTX3090也能跑!Qwen2.5-Omni本地部署避坑指南(含vLLM配置) 当消费级显卡遇上多模态大模型,总会碰撞出令人惊喜的火花。Qwen2.5-Omni作为当前最热门的开源多模态模型之一,其7B版本在RTX3090这类24GB显存的显卡上完全具备…...
Cosmos-Reason1-7B模型微调实战:基于领域数据提升专业问答效果
Cosmos-Reason1-7B模型微调实战:基于领域数据提升专业问答效果 想让一个通用大模型变成你所在领域的专家吗?比如,让它精通法律条文解读,或者能回答专业的医疗咨询。直接拿现成的Cosmos-Reason1-7B来用,效果可能差强人…...
如何快速开发Kibana自定义React组件:面向开发者的完整指南
如何快速开发Kibana自定义React组件:面向开发者的完整指南 【免费下载链接】kibana Your window into the Elastic Stack 项目地址: https://gitcode.com/GitHub_Trending/ki/kibana Kibana作为Elastic Stack的核心数据可视化平台,其强大的插件架…...
Qwen3-32B内容创作应用:自动生成文案、报告、邮件
Qwen3-32B内容创作应用:自动生成文案、报告、邮件 1. 为什么选择Qwen3-32B进行内容创作 在当今内容为王的时代,企业每天都需要产出大量高质量的文字内容。从营销文案到产品说明,从客户邮件到内部报告,文字创作已经成为企业运营中…...
Qwen3-1.7B效果实测:轻量级模型也能写出高质量文案和代码
Qwen3-1.7B效果实测:轻量级模型也能写出高质量文案和代码 1. 开篇:小身材,大能量 你可能听过很多关于大模型的讨论,动辄几百亿、上千亿参数,听起来很厉害,但部署起来也让人头疼——需要昂贵的显卡&#x…...
Ice终极指南:3步打造Mac菜单栏的清爽工作空间
Ice终极指南:3步打造Mac菜单栏的清爽工作空间 【免费下载链接】Ice Powerful menu bar manager for macOS 项目地址: https://gitcode.com/GitHub_Trending/ice/Ice Ice是一款专为macOS设计的强大菜单栏管理器,能够帮助用户有效整理和优化混乱的菜…...
ABAQUS复合材料层合板建模与应力分析实战指南
1. ABAQUS复合材料层合板分析入门指南 第一次接触复合材料分析的朋友可能会觉得有点懵,毕竟这玩意儿跟普通金属材料差别太大了。我刚开始用ABAQUS做复合材料分析时,光是理解"铺层方向"这个概念就花了整整一周时间。不过别担心,今天…...
springboot-vue+nodejs的旅游个性化定制平台的设计与实现
目录技术栈选型系统架构设计数据库设计核心功能实现推荐算法实现前端界面设计测试部署方案项目进度安排项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作技术栈选型 后端采用Spring Boot框架,提供RESTful API接口。数…...
智炬星图:在AI星海中,为您点亮诚信与实力的导航灯塔
在数字时代的浪潮中,人工智能已成为驱动产业变革的核心引擎。然而,面对市场上琳琅满目的AI服务商,企业往往陷入选择困境:究竟哪家机构值得信赖?哪家公司能提供真正高效、可靠的智能解决方案?今天࿰…...
