Go语言中GC(垃圾回收回收机制)三色标记与混合写屏障

news2024/12/24 4:04:06

5、Golang三色标记混合写屏障GC模式全分析 (yuque.com)

第1讲-课程目标_哔哩哔哩_bilibili

Golang三色标记+GC混合写屏障

Go V1.3之前的标记清除(mark and sweep)

垃圾回收、内存管理、自动适放、三色标记法、STW (stop the world)

图的遍历?可达性分析

此时第一步为STW暂停(让大家都先别干活了)将1-2-3 4-7等五个可达对象坐上标记,此时没有被标记的对象说明程序是不需要它的

不可达的就会被删除。

标记清除法的缺点

1:让程序暂停,程序出现卡顿(重要问题,影响业务)

2:标记需要扫描整个heap,时间复杂度高

3:清除数据辉产生heap碎片

Go V1.5三色标记法(白灰黑)

尝试采用新的标记模式来替代清除标记法

1、程序起初创建,全部标记为白色,将所有对象放到被色集合

2、遍历Root Set(非递归遍历只遍历一次),得到灰色节点

遍历灰色标记表,将可达的对象从白色标记为灰色,遍历之后的灰色,标记为黑色

之后再重复上一步,直到灰色标记表中无任何对象

在之后就收集所有白色对象(垃圾)

其本质就是利用队列进行bfs算法,标记所有可达对象

三色标记法中无STW问题?

如果三色标记法中不启动stw情况

然后与此同时,对象2将指向对象3的指针p移除,对象3就被挂在了已经扫描完成的黑色的对象4下,但对象4此时已经在黑色标记表中了

此时的对象3有可能会被垃圾回收掉

所以三色标记法最不希望被发生的事:白色对象被黑色对象引用。条件二:灰色对象丢失那个白色对象的可达关系

两个条件同时满足时,就会出现对象丢失现象!

所以想避免最简单的方式就是STW,STW过程有明显的资源浪费,对所有用户程序都有很大影响。

如何能在保证对象不丢失的情况尽可能的提高GC效率,减少STW时间呢?

但是不用stw所以就避免两个条件同时满足,破坏他们同时成立

1、强三色不变式

强制性的不允许黑色对象引用白色对象

2、弱三色不变式

黑色对象可以引用白色对象,但是前提是白色对象存在其他灰色对象对它的引用,或则可达它的链路上游存在灰色对象

在三色标记中如果满足强/弱之一,即可保证对象不丢失

插入写屏障和删除写屏障

在程序的执行过程中,额外的添加一条判断机制 例如:Hook、回调、handler

插入屏障:对象被引用时 触发的机制

删除屏障:对象被删除的时候 触发的机制

插入屏障 

堆中触发插入屏障

循环操作后直到没有灰色标记后,在准备回收白色前,重新扫描一下栈空间。此时加STW暂停保护栈,防止外界干扰(有新的白色被黑色添加)

之后再进行清除

插入屏障的不足:结束时需要STW来重新扫描栈,大约需要10~100ms

删除屏障

这样有可能会出现当对象1删除对象5的时候,把5转换成灰色,有可能会出现,5-2-3本来应该被删除的却变为了黑色对象,所以5-2-3会多活过一轮,在下一轮GC中会被清理掉

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

Go V1.8基于三色标记法的混合写屏障机制

满足:变形的若三色不变式。(结合了插入、删除写屏障两者的优点)

可以达到被移走的对象是被灰色保护的。(弱三色) 和新加入的下游对象标记灰色(强三色)

注意:1是将栈上所有可达对象标为黑色 (它的特点是GC开始的时候优先扫描栈 )栈为了添加效率是不启用屏障的,堆会启用屏障

总结

GoV1.3- 普通标记清除法,整体过程需要启动STW,效率极低。

GoV1.5- 三色标记法, 堆空间启动写屏障,栈空间不启动,全部扫描之后,需要重新扫描一次栈(需要STW),效率普通

GoV1.8-三色标记法,混合写屏障机制, 栈空间不启动,堆空间启动。整个过程几乎不需要STW,效率较高。

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

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

相关文章

轴端命名 及多器件编号

1.轴端命名 轴如果单端动力输入时,动力输入一侧,可以称为: 输入端,驱动端 另一侧可能的称谓是: 支撑端、自由端、从动端、未驱动端、静态支撑端。 另外,在查阅相关称谓时,看到了关于卷扬机…

<Rust>egui部件学习:如何在窗口及部件显示中文字符?

前言 本专栏是关于Rust的GUI库egui的部件讲解及应用实例分析,主要讲解egui的源代码、部件属性、如何应用。 环境配置 系统:windows 平台:visual studio code 语言:rust 库:egui、eframe 概述 本文是本专栏的第一篇博…

简约唯美的404HTML源码

源码介绍 简约唯美的404HTML源码,很适合做网站错误页,将下面的源码放到一个空白的html里面,然后上传到服务器里面即可使用 效果预览 完整源码 <!DOCTYPE html> <html><head><meta charset="utf-8"><title>404 Error Example<…

配置服务器

参考博客 1. https://blog.csdn.net/qq_31278903/article/details/83146031 2. https://blog.csdn.net/u014374826/article/details/134093409 3. https://blog.csdn.net/weixin_42728126/article/details/88887350 4. https://blog.csdn.net/Dreamhai/article/details/109…

Linux主机添加ipv6地址

一、添加网卡ipv6地址 通过命令行添加 ip add add 2001:db8:0:1::102/64 dev ens160 通过编辑/etc/sysconfig/network-scripts/目录下的ifcfg-配置文件添加 TYPEEthernet BOOTPROTOdhcp # 或者指定为 "static" 如果你想要静态配置 DEFROUTEyes IPV4_FAILURE_FAT…

多元统计分析概述

目录 1. 多元回归分析 2. 主成分分析&#xff08;PCA&#xff09; 3. 因子分析 4. 判别分析 5. 聚类分析 6. 多维尺度分析&#xff08;MDS&#xff09; 结论 多元统计分析是一组用于分析多个变量之间关系的统计方法。它广泛应用于各个领域&#xff0c;如市场研究、生物医…

C++中的语句详细介绍:简单语句、条件、循环迭代语句、跳转语句、异常处理语句、try语句等

文章目录 C中的语句(1)简单语句A.空语句B.复合语句 (2)条件语句(3)迭代语句A.常规for循环B.范围for循环C.while和do...while (4)跳转语句A.break语句B.continue语句C.goto语句 (5)异常处理语句A.标准异常B.throw抛出异常 (6)try语句 C中的语句 (1)简单语句 简单语句包括&#…

探索 Python 的宝藏:深入理解 NumPy库

探索 Python 的宝藏&#xff1a;深入理解 NumPy 库 引言&#xff1a;为何选择 NumPy&#xff1f; NumPy 是 Python 中一个基础而强大的库&#xff0c;它为 Python 语言提供了高性能的多维数组对象和相应的操作。在科学计算、数据分析、机器学习等领域&#xff0c;NumPy 以其高…

Android获取当前屏幕显示的是哪个activity

在 Android 中&#xff0c;要获取当前屏幕显示的 Activity&#xff0c;可以使用以下几种方法&#xff1a; 方法一&#xff1a;使用 ActivityManager 获取当前运行的任务信息 这是一个常见的方法&#xff0c;尽管从 Android 5.0 (API 21) 开始&#xff0c;有些方法变得不太可靠…

ctfshow~VIP限免题目20道(保姆级解析)

奈何自己没有实力&#xff0c;看到免费的东西就想占点便宜&#xff0c;想着做都做了就出个wp吧&#xff0c;本人小白&#xff0c;不喜勿喷&#xff01; 一、源码泄露 题目提示&#xff1a;开发注释未及时删除 题目给出了源码泄露&#xff0c;那咱直接看源码&#xff08;右键点…

2.I/O口

文章目录 I/O输出(点灯)分析电路代码编写 I/O输入(电平检测)代码编写 I/O内部电路分析51单片机STM32单片机输入输出 I/O输出(点灯) 分析电路 看电路图&#xff0c;元器件形成电压差&#xff0c;即可点亮LED灯 代码编写 使用不同操作进行LED控制 #include "reg52.h&quo…

AI助手在企业虚拟展厅中的应用有哪些?

在AI人工智能发展的浪潮下&#xff0c;视创云展也在元宇宙展厅中创新的融入了「AI智能助手」&#xff0c;当用户在虚拟展厅内自由探索时&#xff0c;AI智能助手始终如影随形&#xff0c;为用户提供即时、精准的信息解答与互动体验&#xff0c;使参观过程更加智能化、便捷化和个…

吴恩达机器学习笔记 三十八 二进制标签 均值归一化

标签 0 和 1 可以有很多种意义。从回归到二分分类&#xff1a;之前定义 ,而对于二进制标签&#xff0c;通过给出y^(i,j)为 1 的概率&#xff0c;其中 损失函数 均值归一化 计算每个电影的平均得分&#xff0c;例如第一部电影的平均分为2.5&#xff0c;第五部电影的平均分为1.2…

HP iLO5服务器硬件监控指标解读

在现代化数据中心中&#xff0c;服务器的稳定运行对于保障业务的连续性至关重要。HP的iLO&#xff08;Integrated Lights-Out&#xff09;技术&#xff0c;尤其是iLO5版本&#xff0c;为HP服务器提供了强大的远程管理功能。监控易作为一款专业的监控软件&#xff0c;通过支持HP…

Artix7系列FPGA实现SDI视频编解码,基于GTP高速接口,提供3套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案在Xilinx--Kintex系列FPGA上的应用本方案在Xilinx--Zynq系列FPGA上的应用 3、详细设计方案设计原理框图SDI 输入设备Gv8601a 均衡器GTP 高速接口-->解串与串化SMPTE SD/HD/3G SDI IP核BT1120转…

【爬虫】滑块缺口识别

滑块示例 分为背景图 和 滑块图 主要目的 识别背景图滑块缺口 下载识别库 pip install opencvcode import numpy as np import cv2def identify_gap(bg, tp):bg1 np.asarray(bytearray(bg), dtypenp.uint8)tp1 np.asarray(bytearray(tp), dtypenp.uint8)# 灰度bg_img cv2…

MySQL 数据库 - SQL

SQL通用语法 SQL通用语法 SQL语句可以单行或者多行书写&#xff0c;以分号结尾。SQL语句可以使用空格/缩进来增强语句的可读性。 注意&#xff1a;空格和缩进的个数是没有限制的&#xff0c;可以是 “一个” 也可以是 “多个”。MySQL数据库的SQL语句不区分大小写&#xff0c;…

魔幻Vscode,紫色爱好者的福音,真正的智能代码补全

&#x1f349;一、Dracula Official&#xff08;紫色爱好者的福音皮肤&#xff09; Dracula Official插件&#xff0c;打开扩展直接搜索Dracula Official下载即可&#xff0c;下载完成自动换上新皮&#xff01; Dracula Official &#x1f349;二、蓝色主题的福音 Aurora X 安…

[crypt]-密码学心声

通过音乐来传递情报&#xff0c;乐谱如下&#xff1a; 乐谱中有请转成艾塞克、十进制等等&#xff0c;可以将数字转为assic试试&#xff0c;1234567&#xff0c;猜测是8进制&#xff0c;三位一组&#xff0c;破解如下&#xff1a; oct8 [111, 114, 157, 166, 145, 123, 145, …

【2024】VsCode + Latex + Linux(Ubuntu) + wsl环境下配置教程 | 包含 中文配置,和 格式化处理

前言 本篇教程是针对WSL下的Ubuntu操作系统的配置教程&#xff0c;它和一般的Linux环境下的配置有所不同&#xff0c;并且和Windows环境下的也有所不同。 本篇博客编写参考了 官方文档&#xff08;Tex&#xff09; 和 插件官方&#xff08;Texlive Workshop&#xff09; 文档…