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 …...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...