golang-GC垃圾回收

news2024/11/20 11:27:10

参考:https://juejin.cn/post/7040737998014513183#comment

垃圾回收(Garbage Collection,缩写为GC),是一种自动内存管理机制。

相关术语

赋值器:说白了就是你写的程序代码,在程序的执行过程中,可能会改变对象的引用关系,或者创建新的引用。

回收器:垃圾回收器的责任就是去干掉那些程序中不再被引用得对象

STW:全称是stop the word,GC期间某个阶段会停止所有的赋值器,中断你的程序逻辑,以确定引用关系。

root对象:根对象是指赋值器不需要通过其他对象就可以直接访问到的对象,通过Root对象, 可以追踪到其他存活的对象。常见的root对象有:栈变量、堆变量。

GC发展过程

v1.3 标记清除法

GC过程开启STW,从root根节点出发标记所有可达节点,停止STW后回收未标记的节点。
在这里插入图片描述
弊端:在整个GC期间需要STW,将整个程序暂停,有极大的性能损耗。

v1.5 三色标记法

对象分为黑、白、灰三种颜色。最终,可达对象都会变成黑色,不可达对象为白色,灰色为中间过渡态。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

最后回收不可达的白色对象,GC操作完成。

在这个过程中仍然需要进行STW,因为在每次GC操作过程中,只有灰色对象下游的白色对象会被扫描(判断是否需要回收)。如果在GC过程中由于程序的运行出现黑色对象引用白色对象的情况,那么存活的白色对象会被GC程序误杀。

在这里插入图片描述
图:原先2->3,经过程序运行,变成6->3。

Golang是如何解决这个STW问题的呢?
其实总结来看,在三色标记法的过程中对象丢失,需要同时满足下面两个条件:

条件一:白色对象被黑色对象引用
条件二:灰色对象与白色对象之间的可达关系遭到破坏

看来只要把上面两个条件破坏掉一个,就可以保证对象不丢失,所以我们的golang团队就提出了两种破坏条件的方式:强三色不变式和弱三色不变式。

强三色不变式

规则:不允许黑色对象引用白色对象

破坏了条件一: 白色对象被黑色对象引用
解释:如果一个黑色对象不直接引用白色对象,那么就不会出现白色对象扫描不到,从而被当做垃圾回收掉的尴尬。

在这里插入图片描述

弱三色不变式

规则:黑色对象可以引用白色对象,但是白色对象的上游必须存在灰色对象

破坏了条件二:灰色对象与白色对象之间的可达关系遭到破坏

解释: 如果一个白色对象的上游有灰色对象,则这个白色对象一定可以扫描到,从而不被回收

在这里插入图片描述

屏障机制

Golang团队遵循上述两种不变式提到的原则,分别提出了两种实现机制:插入写屏障删除写屏障

插入写屏障:仅在堆上生效

规则:当一个对象引用另外一个对象时,将另外一个对象标记为灰色。

满足:强三色不变式。不会存在黑色对象引用白色对象

插入屏障仅会在堆内存中生效,不对栈内存空间生效,因为栈空间操作过于频繁,会引发性能问题。

弊端:在一次正常的三色标记流程结束后,由于插入写屏障不会对栈空间起作用,仍有可能在栈空间出现黑色对象引用白色对象的情况,需要对栈上重新进行一次stw,然后再rescan一次。

删除写屏障

规则:在删除引用时,如果被删除引用的对象自身为灰色或者白色,那么被标记为灰色。

满足弱三色不变式。灰色对象到白色对象的路径不会断

解释:白色对象始终会被灰色对象保护

弊端:就是一个对象的引用被删除后,即使没有其他存活的对象引用它,它仍然会活到下一轮。如此一来,会产生很多的冗余扫描成本,且降低了回收精度。

在这里插入图片描述

对比插入写屏障和删除写屏障:

插入写屏障:

插入写屏障哪里都好,就是栈上的操作管不到,所以最后需要对栈空间进行stw保护,然后rescan保证引用的白色对象存活。

删除写屏障:

在GC开始时,会扫描记录整个栈做快照,从而在删除操作时,可以拦截操作,将白色对象置为灰色对象。
回收精度低。

v1.8 混合写屏障机制

混合屏障机制的核心定义:

GC刚开始的时候,会将栈上的可达对象全部标记为黑色。

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

上面两点只有一个目的,将栈上的可达对象全部标黑,最后无需对栈进行STW,就可以保证栈上的对象不会丢失。有人说,一直是黑色的对象,那么不就永远清除不掉了么,这里强调一下,标记为黑色的是可达对象,不可达的对象一直会是白色,直到最后被回收。

堆上被删除的对象标记为灰色

堆上新添加的对象标记为灰色

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

Golang v1.3之前采用传统采取标记-清除法,需要STW,暂停整个程序的运行。

在v1.5版本中,引入了三色标记法和插入写屏障机制,其中插入写屏障机制只在堆内存中生效。但在标记过程中,最后需要对栈进行STW。

在v1.8版本中结合删除写屏障机制,推出了混合屏障机制,屏障限制只在堆内存中生效。避免了最后节点对栈进行STW的问题,提升了GC效率

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

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

相关文章

《架构设计》-08-分布式系统和Rpc架构

文章目录 1. 分布式系统1.1 横向拆分1.2 分布式服务框架优缺点1.3 功能/非功能需求 2. RPC架构2.1 概述2.2 网络通信2.3 序列化2.3.1 概述2.3.2 传输协议 2.4 服务调用2.4.1 概述2.4.2 同步调用2.4.3 异步调用(Future模式为例)1)Future-Get模…

day2 OSI七层体系结构

目录 网络体系结构的形成 协议与划分层次 OSI七层体系结构 网络体系结构的形成 两台计算机要互相传送文件需解决很多问题; (1) 必须有一条传送数据的通路。 (2) 发起方必须激活通路。 (3) 要告诉网络如何识别接收方。 (4) 发起方要清楚对方是否已开机&#…

绿色节约型校园电力能耗监控系统的设计与应用方案

摘 要:校园中能源的消耗与浪费占用了校园总费用支出的很大比例,而电能的消耗又是能源消耗的重中之重,重点阐述了校园能耗监控系统方案设计、关键技术。以北方某高校为例应用该方案,并结合具体的耗能特点对节能措施进行研究。 关…

养老保障金查询系统【GUI/Swing+MySQL】(Java课设)

系统类型 Swing窗口类型Mysql数据库存储数据 使用范围 适合作为Java课设!!! 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址:https://download.csdn.net/download/qq_50954361/87700421 更多系统资源库…

Linux中的DNS域名解析配置及原理

Linux中的DNS域名解析配置及原理 DNS系统的作用1、DNS系统的分布式数据结构2、DNS域名解析方式3、通过BIND做DNS解析部署 DNS系统的作用 DNS域名系统是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互…

2023前端面试上岸手册——JavaScript 部分

目录 JavaScript 有哪些数据类型,它们的区别?数据类型检测的方式有哪些null 和undefined 区别如何获取安全的 undefined 值?Object.is() 与比较操作符 “两等” 、“三等” 的区别?什么是 JavaScript 中的包装类型?为什…

华为OD机试真题(Java),最远足迹(100%通过+复盘思路)

一、题目描述 某探险队负责对地下洞穴进行探险。探险队成员在进行探险任务时,随身携带的记录器会不定期地记录自身的坐标,但在记录的间隙中也会记录其他数据。探索工作结束后,探险队需要获取到某成员在探险过程中相对于探险队总部的最远的足…

2-01 在Nginx中配置静态资源防盗链

2-01 在Nginx中配置静态资源防盗链 IQ1AK-1682304821705)]

基于Spring+SpringMVC+MyBatis框架的Java在线考试系统

项目介绍 基于SpringSpringMVCMyBatis框架的Java在线考试系统 功能模块 |用户功能模块|用户注册登陆|用户可以通过用户名邮箱注册网站,并且通过注册的用户登陆网站。|随机练习|从题库中随机取出指定数量的题目供学员练习。|强化练习|按照学员知识分布情况&#xff…

SpringBoot【运维实用篇】---- 配置高级

SpringBoot【运维实用篇】---- 配置高级 1. 临时属性设置属性加载优先级开发环境中使用临时变量 2. 配置文件分类3. 自定义配置文件 关于配置在基础篇讲过一部分,基础篇的配置总体上来说就是让各位小伙伴掌握配置的格式。比如配置文件如何写啊,写好的数据…

HCIP之路VLAN,三层交换机,STP---生成树协议,MSTP

VLAN---虚拟局域网 垃圾流量问题 网络安全问题 VLAN特点 一个vlan就是一个广播域,不同vlan内部的数据无法进行跨广播域通讯 vlan的划分不受地域限制 vlan的实现 主机的网卡一般只能发送和接收无标记帧(Untagged Frame)。Tagged Frame --- 标…

Nginx的优化-安全与防盗链

1.Nginx的网页优化-网页压缩 在Nginx的ngx_http_gzip_module压缩模块提供对文件内容压缩的功能。进行相关的配置修改,就能实现Nginx页面的压缩,达到节约带宽,提升用户访问速度 重启服务进行访问测试 2.配置Nginx的图片缓存 当Nginx将网页数据…

ElasticSearch入门学习:基础概念与简介

文章目录 一、ElasticSearch基础概念铺垫1.1 全文检索概念1.2 正排索引与倒排索引 二、ElasticSearch简介2.1 ElasticSearch简介2.2 ElasticSearch生态圈-Elastic Stack2.3 ElasticSearch与Solr搜索引擎对比 声明:以下内容均来自b站 ElasticSearch入门到精通教程&a…

百度平地起“雷”,突然爆出的QPS数据意味着什么?

鲁迅先生1923年在北师大发表了著名的演讲《娜拉走后怎样》,其中的提问与思考方式振聋发聩,直到今天也依旧有效。面对很多产业现象、技术趋势,我们也不妨多问几个“之后怎样”。 比如说,自ChatGPT爆火之后,中国各个互联…

敏捷的动力之源是小而美(powered by GPT)

​ Stacey模型反映了组织运作模式。纵轴是政制,横轴是技术。敏捷偏右下↘,在技术领域与天地斗。反敏捷偏左上,在政制领域与人斗。敏捷是活化,反敏捷是消耗。敏捷的根本障碍是管理文化。理解了这个图就理解了敏捷。要么权力-恐惧-小…

倾斜摄影超大场景的三维模型OSGB格式转换3DTILES,为什么数据文件大小会变大?

倾斜摄影超大场景的三维模型OSGB格式转换3DTILES,为什么数据文件大小会变大? 在将倾斜摄影超大场景的三维模型从OSGB格式转换到3DTILES格式时,数据文件大小可能会比原始数据文件变大的原因主要有以下几个: 1、数据压缩方式不同&a…

Hive基础和使用详解

文章目录 1. hive的启动2. hive -help 命令3. hive -e 命令4. hive -f 命令5. 退出hive窗口6. 在hive窗口中执行dfs -ls /;7. Hive其他参考 1. hive的启动 前置条件: 1.保证hdfs和yarn已启动 2.保证hive的元数据库mysql已启动 启动方式一: hive命令 --切换到hive目…

基础自动化测试脚本开发——Loadrunner如何进行网站脚本开发

一、检查虚拟机ip是否与宿主机ip网段一样 若发现虚拟机IP地址网段与宿主机IP地址不一致时,应在手动改为宿主机IP网段的静态IP地址。 在dos系统下利用ping命令来判断网页的连通性,若连通性不通过,则重新修改分配该虚拟机静态IP地址&#xff08…

二分查找学习总结心得

二分查找一般运用在有序数组中的查找,一般分为开区间、闭区间和半开半闭区间三种写法 闭区间 闭区间是指包含左右两边元素的区间,例如:区间[a, b]包含元素 a b ,称为闭区间。 代码1 # 左闭右闭 区间写法 在数组 nums 中寻找 target def …

LVS负载均衡集群——NAT部署

一、企业群集应用概述 1、群集的含义 • Cluster、集群、群集 • 由多台主机构成,但对外只表现为一个整体,只提供一个访问入口(域名或IP地址),相当于一台大型计算机 2、问题及解决方法 问题: 互联网应用中,随着站…