Golang的GC

news2025/2/27 3:02:11

目录

介绍GC

概要

什么是根对象

三色标记法

什么情况下三色标记法会失效

屏障机制

“强-弱” 三色不变式

插入屏障 (强三色)

 删除屏障(弱三色)

Go 的混合写屏障机制

混合写屏障规则


介绍GC

概要

  • 作用范围:只回收堆内存,不回收栈内存(函数执行完毕后直接释放)
  • 主流 GC 算法:引用计数(Python)、分代收集(Java)、标记-清除(Golang 使用三色标记法)
  • 触发时机:
  • 主动触发:调用 runtime.GC()
  • 被动触发:定时触发(默认为 2 分钟)、当前堆内存占用为上次 GC 后内存占用的两倍

什么是根对象

全局变量:编译器就能确定存在于程序整个生命周期的变量

执行栈:每个 goroutine 都有自己的执行栈,执行栈上包含栈上的变量及指向分配的堆内存指针


寄存器: 寄存器的值可能表示一个指针,参与计算的这些指针可能指向某些赋值器分配的堆内存块

三色标记法

Golang中的垃圾回收主要应用三色标记法,GC过程和其他用户goroutine可并发运行,但需要一定时间的STW(stop the world)

所谓三色标记法实际上就是通过三个阶段的标记来确定清楚的对象都有哪些?

我们来看一下具体的过程。

第一步 , 每次新创建的对象,默认的颜色都是标记为“白色”,如图所示。

 第二步, 每次GC回收开始, 会从根节点开始遍历所有对象,把遍历到的对象从白色集合放入“灰色”集合如图所示。

如果 本次到 对象1 和 对象4 便遍历完,本次GC结束

第三步, 遍历灰色集合,将灰色对象引用的对象从白色集合放入灰色集合,之后将此灰色对象放入黑色集合,如图所示。

第四步,重复上面的步骤我们可以得到如下

剩下的就是全部依赖的黑色对象,然后我们把白色的对象删除,本轮GC 结束

什么情况下三色标记法会失效

以下条件在三色标记法中,是不希望被发生的。

条件1: 一个白色对象被黑色对象引用(白色被挂在黑色下)

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

如果当以上两个条件同时满足时,就会出现对象丢失现象!

如图所示,对象2原本指向对象3,但是丢了对象3      黑色对象4 已经完成扫描了,但是对象3挂在上面

这就导致 对象三 没有被扫描 变成灰色 进入 灰色表内,导致被GC给“误杀”回收掉了。

 为了防止这种现象的发生,最简单的方式就是STW,直接禁止掉其他用户程序对对象引用关系的干扰,但是STW的过程有明显的资源浪费,对所有的用户程序都有很大影响

那么是否可以在保证对象不丢失的情况下合理的尽可能的提高GC效率,减少STW时间呢?

答案是可以的,我们只要使用一种机制,尝试去破坏上面的两个必要条件就可以了。

屏障机制

“强-弱” 三色不变式

强三色不变式

不存在黑色对象引用到白色对象的指针。

强三色不变色实际上是强制性的不允许黑色对象引用白色对象,就不会出现有白色对象被误删况。

弱三色不变式

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

插入屏障 (强三色)

具体操作:在A对象引用B对象的时候,B对象被标记为灰色。(将B挂在A下游,B必须被标记为灰色)

满足:强三色不变式. (不存在黑色对象引用白色对象的情况了, 因为白色会强制变成灰色)

流程:

对于 堆对象来说 新挂上的对象标记为灰色,如图所示 对象3原本为白,被标记为灰 

栈对象来说: 如图 新加入的 对象8 为白色 挂在黑色对象1上

如果栈不添加,当全部三色标记扫描之后,栈上有可能依然存在白色对象被引用的情况(如上图的对象8).  所以要对栈重新进行三色标记扫描, 但这次为了对象不丢失, 要对本次标记扫描启动STW暂停. 直到栈空间的三色标记结束.

为什么对栈对象不进行 插入写屏障? 

因为栈空间调用更加频繁,且更加快速,这里如果每次插入的时候都检查(父节点是否为黑)会让栈的速度变慢,而栈空间和堆空间来比较的话,就是快,所以这里为了性能,不进行插入屏障,而是在最后再重新扫描一次

 删除屏障(弱三色)

具体操作: 被删除的对象,如果自身为灰色或者白色,那么被标记为灰色。

满足: 弱三色不变式. (保护灰色对象到白色对象的路径不会断)

会导致什么呢?  本应该被清理的 对象2 偷偷活过了这一轮 GC 检查 

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

Go 的混合写屏障机制

插入写屏障和删除写屏障的短板:

插入写屏障:结束时需要STW来重新扫描栈,标记栈上引用的白色对象的存活; 
删除写屏障:回收精度低,GC开始时STW扫描堆栈来记录初始快照,这个过程会保护开始时刻的所有存活对象。 

Go V1.8版本引入了混合写屏障机制,避免了对栈重新检查的过程,极大的减少了STW的时间。结合了两者的优点。

混合写屏障规则

具体规则

1、GC开始将栈上的对象全部扫描并标记为黑色(之后不再进行第二次重复扫描,无需STW),

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

3、被删除的对象标记为灰色。

4、被添加的对象标记为灰色。

满足

变形的弱三色不变式.

插入写屏障  的图作对比

新加入的栈节点也为黑

删除写屏障  的图作对比

避免 某些对象多存活一轮

总结:栈上的对象(包括其引用对象)赦免,堆上的对象既进行插入屏障,又进行删除屏障 

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

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

相关文章

Stability AI发布新版文生图模型:依然开源

Stability AI最近发布了Stable Diffusion 3 Medium(简称SD3 Medium),这是其最新的文生图模型,被官方称为“迄今为止最先进的开源模型”。SD3 Medium的性能甚至超过了Midjourney 6,特别是在生成手部和脸部图像方面表现出…

汇聚荣科技有限公司在拼多多评价上好不好?

汇聚荣科技有限公司在拼多多平台的评价如何,这是很多消费者在选择购买该公司产品时会关心的问题。通过深入分析,我们可以从多个维度来探讨这一问题。 一、产品质量 对于任何公司而言,产品的质量是其生存和发展的根本。根据用户反馈和相关评价…

Python的Pillow(图像处理库)非常详细的学习笔记

Python的Pillow库是一个非常强大的图像处理库。 安装Pillow库: 在终端或命令行中输入以下命令来安装Pillow: pip install pillow 安装后查看是否安装成功以及当前版本 pip show Pillow 升级库: pip install pillow --upgrade 一些基…

css入门基础

目录 1. CSS前景 2.什么是CSS 3.CSS发展史 4.CSS的3种样式格式 5.CSS 的语法 6.CSS的字体样式 7.选择器类型 8.CSS外观属性 1. CSS前景 从HTML被发明开始,样式就以各种形式存在。不同的浏览器结合它们各自的样式语言为用户提供页面效果的控制。最初的HTML只…

【我是产品经理_注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞 …

JavaScript的函数(几种函数的定义和使用)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

UKP3D用户定制图框的思路

为用户定制图框,记录以下图框制作方法,便于用户自已修改。 1.轴测图与平面图的图框: 1.1.图框在安装目录下,例如:E:\Program Files (x86)\UKSoft\UKP3d9.2\config\TemplateAndBlock\CADTemplate\ 1.2.配置文件在安装…

Qt creator day1 练习

自由发挥登录窗口的应用场景,实现一个登录窗口界面,要求:第行代码都有注释 #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {this->setWindowTitle("贪玩蓝月——是兄弟就来砍我 登入&#…

Google play,应用被下架,活跃用户断崖式下跌?

相信在Google paly上架应用的开发者,都经历过应用被下架的情况。不少开发者吐槽,应用被下架之后,前期推广积累的活跃用户也会一个星期内断崖式下跌,这就很难搞了,严重影响了收益。 (想与众多开发者交流谷歌…

Armbian OS(基于ubuntu24) 源码编译mysql 5.7

最近弄了个S905X3的盒子刷完Armbian OS (基于ubuntu24),开始折腾Arm64之旅。第一站就遇到了MySQL的问题,由于MySQL没有提供Arm64版本,又不想塞Docker镜像,因此选择源码来编译MySQL5.7。下面记录详细过程和遇…

磁盘管理 以及磁盘的分区 详细版

磁盘管理 track:磁道,就是磁盘上同心圆,从外向里,依次1号、2号磁道sector:扇区,将磁盘分成一个一个扇形区域,每个扇区大小是512字节,从外向里,依次是1号扇区、2号扇区cylinder&…

swift5 在当前控制器先dismiss后pop

如下图需要在present当前控制器时用全局变量firmwareUpgradePresentingVC先引用上一个控制器(下面的代码亲测有效) func dismissAndPop() {self.dismiss(animated: false) {firmwareUpgradePresentingVC.navigationController!.popViewController(animat…

比利时海外媒体宣发,发稿促进媒体通稿发布新形势-大舍传媒

引言 随着全球化的推进,海外媒体的影响力也日益增强。在这一背景下,比利时海外媒体的宣发工作成为了媒体通稿发布的新形势。大舍传媒作为一家专注于宣传推广的公司,一直致力于与比利时博伊克邮报(boicpost)合作&#…

ubuntu软件安装

目录 更新Ubuntu软件下载地址 1. 寻找国内镜像源 2. 备份Ubuntu默认的源地址 3. 更新源服务器列表 4. 更新源 更新Ubuntu软件下载地址 1. 寻找国内镜像源 所谓的镜像源:可以理解为提供下载软件的地⽅,⽐如 Android ⼿机上可以下载软件的 91 ⼿机助…

荣耀正式发布Magic V Flip,打造全形态折叠屏矩阵

6月13日,荣耀Magic V Flip科技时尚大秀在上海举行。作为荣耀旗下首款小折叠手机,荣耀Magic V Flip的问世标志着荣耀完成折叠屏全体系的最终部署,成为少数集齐现有各类折叠屏手机形态的品牌之一。 荣耀从消费者需求出发,以AI和折叠…

Spring Security——添加验证码

目录 项目总结 新建一个SpringBoot项目 VerifyCode(生成验证码的工具类) WebSecurityController控制器 VerifyCodeFilter(自定义过滤器) WebSecurityConfig配置类 login.html登录页面 项目测试 本项目是以上一篇文章的项目…

【知识整理】软件版本号的定义及规范

版本号简述 在软件开发项目中,版本号是一个非常重要的概念,它能够告诉用户软件的功能、质量和安全性等信息,同时也可以帮助开发者追踪软件的历史和进展,并做好版本控制工作。在本文中,我们将介绍版本号的定义及规范&a…

创新入门|生成式AI创新赋能优势解析,获取生成式AI知识的10大方法

生成式AI技术对员工和企业影响深远。对于员工而言,生成式AI能够提升工作效率,简化重复性任务,并为创意和决策提供支持。对于企业而言,生成式AI在产品创新、市场营销、客户服务和运营优化等方面发挥重要作用,帮助预测市…

一篇文章全面了解Ajax框架

目录 什么是AJAX? 如何使用AJAX? 语法 url详解 URL的概念 URL的组成 URL查询参数 axios axios-查询参数 axios-请求配置 常用请求方法 axios-错误处理 HTTP协议 HTTP协议-请求报文 HTTP协议-响应报文 接口文档 AJAX原理 AJAX原理 - XM…

【STM32】飞控设计

【一些入门知识】 1.飞行原理 【垂直运动】 当 mg>F1F2F3F4,此时做下降加速飞行 当 mg<F1F2F3F4,此时做升高加速飞行 当 mgF1F2F3F4 ,此时垂直上保持匀速飞行。 【偏航飞行】 ω 4 ω 2 ≠ ω 1 ω 3 就会产生水…