深入理解GO语言——GC垃圾回收二

文章目录

  • 前言
  • 一、Go V1.5的三色并发标记法
  • 总结


前言

书接上回,无论怎么优化,Go V1.3都面临这个一个重要问题,就是mark-and-sweep 算法会暂停整个程序 。 Go是如何面对并这个问题的呢?接下来G V1.5版本 就用 三色并发标记法 来优化这个问题


一、Go V1.5的三色并发标记法

Golang中的垃圾回收主要应用三色标记法,GC过程和其他用户goroutine可并发运行,但需要一定时间的STW(stop the world) ,所谓三色标记法实际上就是通过三个阶段的标记来确定清楚的对象都有哪些?我们来看一下具体的过程。

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

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

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

在这里插入图片描述
这里 要注意的是,本次遍历是一次遍历,非递归形式,是从程序抽次可抵达的对象遍历一层,如上图所示,当前可抵达的对象是对象1和对象4,那么自然本轮遍历结束,对象1和对象4就会被标记为灰色,灰色标记表就会多出这两个对象。

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

在这里插入图片描述

这一次遍历是只扫描灰色对象,将灰色对象的第一层遍历可抵达的对象由白色变为灰色,如:对象2、对象7. 而之前的灰色对象1和对象4则会被标记为黑色,同时由灰色标记表移动到黑色标记表中。

第四步, 重复第三步, 直到灰色中无任何对象,如图所示。

在这里插入图片描述

在这里插入图片描述

当我们全部的可达对象都遍历完后,灰色标记表将不再存在灰色对象,目前全部内存的数据只有两种颜色,黑色和白色。那么黑色对象就是我们程序逻辑可达(需要的)对象,这些数据是目前支撑程序正常业务运行的,是合法的有用数据,不可删除,白色的对象是全部不可达对象,目前程序逻辑并不依赖他们,那么白色对象就是内存中目前的垃圾数据,需要被清除。

第五步: 回收所有的白色标记表的对象. 也就是回收垃圾,如图所示。

以上我们将全部的白色对象进行删除回收,剩下的就是全部依赖的黑色对象。

在这里插入图片描述

收集所有的白色对象(垃圾)

以上便是三色并发标记法,不难看出,我们上面已经清楚的体现三色的特性。但是这里面可能会有很多并发流程均会被扫描,执行并发流程的内存可能相互依赖,为了在GC过程中保证数据的安全,我们在开始三色标记之前就会加上STW,在扫描确定黑白对象之后再放开STW。但是很明显这样的GC扫描的性能实在是太低了。


总结

那么Go是如何解决标记-清除(mark and sweep)算法中的卡顿(stw,stop the world)问题的呢?
我们后续继续总结

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

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

相关文章

WPS快速将插入Excle数据插入Word

前置条件: 一张有标题、数据的excle表格word中的表格与excle表格标题对应或包含电脑已经安装WPS软件 第一步、根据word模板设计excle模板,标头对应 第二步、word上面选【引用】--【邮件】,选打开数据源,找到excle文件,…

论文笔记:Detecting Pretraining Data from Large Language Models

iclr 2024 reviewer评分 5688 1 intro 论文考虑的问题:给定一段文本和对一个黑盒语言模型的访问权限,在不知道其预训练数据的情况下,能否判断该模型是否在这段文本上进行了预训练 这个问题是成员推断攻击(Membership Inference Attacks&…

HarmonyOS实战开发-如何实现分布式帐号相关的功能。

介绍 本示例主要展示了分布式帐号相关的功能,使用ohos.account.distributedAccount、ohos.account.osAccount等接口,实现了绑定分布式帐号、解绑分布式帐号、更新分布式帐号信息和管理分布式帐号的功能; 效果预览 使用说明 1.首次进入应用会…

软件设计师26--关系代数

软件设计师26--关系代数 考点1:关系模式相关概念例题: 考点1:关系模式相关概念 并∪:结果是两张表所有记录的合并,相同记录只显示一次。 交∩:结果是两张表中相同的记录。 差-:S1-S2&#xff0…

Python程序设计 字符类型及其操作

1. 提取身份证号性别 通过身份证的第17位也就是倒数第二位的数字可以辨别该身份证所属人的性别,奇数为男性,偶数为女性。 输入身份证号,第17位若是偶数,输出性别女,否则输出性别男 1.通过input()函数接收用户输入的身份证号,将其…

npm发布包至私有仓库

前提:使用verdaccio在服务器搭建好了私有仓库 1、登录至私服 npm adduser --registryhttp://xxx.xxx.x.xx:48732、发布npm包到私有仓库 修改package.json中的相关信息后 #cd 项目目录 npm publish --registryhttp://xxx.xxx.x.xx:4873登录至私服查看 3、在项目中…

性能分析-CPU知识

目录 CPU知识 cpu组成 查看cpu信息: top命令中 cpu相关: top命令看到系统负载: CPU负载 IO负载 上下文: CPU的寄存器和程序计数器----在cpu的控制器中 实战演示分析 top命令分析 arthas工具 进程上下文切换高的问题分析…

《MATLAB科研绘图与学术图表绘制从入门到精通》

解锁MATLAB科研绘图魅力,让数据可视化成为你的科研利器! 1.零基础快速入门:软件操作实战案例图文、代码结合讲解,从入门到精通快速高效。 2.多种科研绘图方法:科研绘图基础变量图形极坐标图形3D图形地理信息可视化等&a…

pdf操作器(图片转文字、PDF转word、PDF拆分、图片jpg、png互转)

pdf操作器(不用联网图片转文字、PDF转word、PDF拆分、图片jpg、png互转)介绍目前该软件实现了以下功能 pdf转wordpdf拆分图片,图片导出在桌面的一个文件夹里图片合并为pdf压缩、转换图片格式(jpg和png)OCR图片转文字&…

【计算机网络经典面试题】简述 TCP 三次握手和四次挥手的过程

TCP链接 1.三次挥手2.四次挥手3.拓展说说 TCP 2次握手行不行?为什么要3次 1.三次挥手 1)第一次握手:建立连接时,客户端向服务器发送SYN包(seqx),请求建立连接,等待确认 2&#xff09…

C++中的vector与C语言中的数组的区别

C中的vector和C语言中的数组在很多方面都有所不同,以下是它们之间的一些主要区别: 大小可变性: vector是C标准模板库(STL)提供的动态数组容器,它的大小可以动态增长或减少。这意味着你可以在运行时添加或删…

【AIGC】HF-Mirror 使用说明(MacOS 版)

今天这篇文章主要是记录 HF-Mirror 的使用过程,官网上提供了 Linux 和 Windows 的使用方式。本人作为 MacOS 用户也将自己的使用办法记录一下,希望能够帮助到其他人。 HF-Mirror 是什么? HF-Mirror 是大神 padeoe 开源的 huggingface 镜像站…

CVE-2023-2928 DedeCMS 文件包含漏洞getshell 漏洞分析

DedeCMS(也称为织梦CMS)是一款基于PHPMySQL的开源内容管理系统。 在 DedeCMS 5.7.106 及之前的版本中发现一个漏洞。它已被宣布为关键。受此漏洞影响的是未知功能的文件uploads/dede/article_allowurl_edit.php。对参数 allurls 的操作会导致代码注入。…

解决前端性能瓶颈:高效处理大量数据渲染与复杂交互的策略与优化方法

✨✨祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心!✨✨ 🎈🎈作者主页: 喔的嘛呀🎈🎈 目录 引言 一、分页加载数据 二、虚拟滚动 三、懒加载 四、数据缓存 五、减少重绘和回流 …

基本乐理(识别和构成和弦一)阅读记录一

和弦、 和弦是非常好听的,顾名思义。我现在阅读的书籍是《基本乐理》- 作者李重光,直接跳跃到第十九章进行阅读。 理解和弦 书中介绍对理解和弦的前提要素是要对音程要掌握。 如:大三度 如:小三度 如:纯五度 音程 音…

如何使用Java和RabbitMQ实现延迟队列?

前言 今天我们使用Java和RabbitMQ实现消息队列的延迟功能。 前期准备,需要安装好docker、docker-compose的运行环境。 需要安装RabbitMQ的可以看下面这篇文章。 如何使用PHP和RabbitMQ实现消息队列?-CSDN博客 今天讲的是依赖RabbitMQ的延迟插件实现…

Python---Numpy线性代数

1.数组和矩阵操作: 创建数组和矩阵:np.array, np.matrix 基本的数组操作:形状修改、大小调整、转置等 import numpy as np# 创建一个 2x3 的数组 A np.array([[1, 2, 3], [4, 5, 6]]) print("数组 A:\n", A)# 将数组 A 转换为矩阵…

SpringBoot项目打包和部署

目录 1.插件 2.打包 3.运行 1.插件 此插件会在pom中自动添加 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></bu…

【软考】23种设计模式详解,记忆方式,并举例说明

23种设计模式详解&#xff0c;举例说明 一、创建型模式1.1、抽象工厂模式&#xff08;Abstract Factory&#xff09;1.1.1、简介1.1.2、意图与应用场景1.1.3、结构1.1.4、优缺点1.1.4、示例代码&#xff08;简化版&#xff09; 1.2、建造者模式&#xff08;Builder&#xff09;…

c++的学习之路:16、string(3)

上章有一些东西当时没学到&#xff0c;这里学到了将在补充&#xff0c;文章末附上代码&#xff0c;思维导图。 目录 一、赋值重载 二、带模板的创建 三、析构函数 四、代码 五、思维导图 一、赋值重载 这里的赋值重载就是直接利用交换函数进行把传参生成的临时数据和需要…