当前位置: 首页 > news >正文

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 标记法

流程:

  1. 暂停程序
  2. 从入口标记所有可达的对象
  3. 删除不可达的对象
  4. 恢复程序
  • 这种方式存在一个STW(stop the world)时间。

Go 1.5 三色标记法

  • 解决上个版本存在STW的问题。
  • 三个颜色:
    白色:尚未访问过
    黑色对象已访问过,而且本对象 引用到 的其他对象 也全部访问过了
    灰色对象已访问过,但是本对象 引用到 的其他对象 尚未全部访问完。全部访问后,会转换为黑色。

流程:

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

在这里插入图片描述
Root Set根节点集合:程序运行到当前时刻的栈和全局数据区域。

BFS遍历一层,使用两个数组:灰色数组和黑色数组。

  1. 把白色可达的1,4加入灰色。
  2. 灰色遍历后变成黑色,即 1,4变成黑色。
  3. 灰色遍历到的2,7由白转灰。
  4. 反复遍历灰色直至没有灰色。
  5. 回收白色。

但如果GC过程中程序在运行,上述引用关系会实时改变,则此方法会误删白色对象。
在运行时能导致错误GC的场景是:

  1. 白色被黑色所引用
  2. 灰色到白色的引用失效

白色被黑色所引用

屏障机制

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

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

为了遵循上述的两个方式,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. 解压文件&#xff1a…...

德国储能项目锂电池储能集装箱突发火灾:安全挑战再引关注

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。 为了让它能够稳定持续的运行&#xf…...

本地连接服务器Jupyter【简略版】

首先需要在你的服务器激活conda虚拟环境: 进入虚拟环境后使用conda install jupyter命令安装jupyter: 安装成功后先不要着急打开,因为需要设置密码,使用jupyter notebook password命令输入自己进入jupyter的密码: …...

sql 注入 1

当前在email表 security库 查到user表 1、第一步,知道对方goods表有几列(email 2 列 good 三列,查的时候列必须得一样才可以查,所以创建个临时表,select 123 ) 但是你无法知道对方goods表有多少列 用order …...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...