问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Golang的垃圾回收

发布网友 发布时间:2022-12-16 19:12

我来回答

1个回答

热心网友 时间:2024-12-11 17:27

最近垃圾分类的话题热度一下子就上去了,很多人因为垃圾分类的问题很头痛。因为垃圾这个话题,那我就想来说说Golang里面的垃圾,于是就有了这篇博客,golang中的垃圾回收。

现阶段网上针对golang垃圾回收的解析已经很多了,所以我也没有必要仔仔细细的一点点说,还是那个原则,用最直白的话告诉你,垃圾到底是怎么收的。

首先本文后续都会使用 GC 代替垃圾回收这几个字。
我们知道创建对象会给他分配内存资源,如果这个对象不使用了,而这个内存资源却一直被占用的话,那么我们的电脑很快就会被放满,所以需要将这些垃圾对象进行回收。

要回收,那么我们必须知道什么才是垃圾,什么不是垃圾。
在我们看来,一个对象以后都不用了,就是垃圾。
在程序看来,一个对象没有被引用了,就是垃圾。

首先说明一下,下面说的停,都是STW,stop the world,全世界暂停,所有运行的都停下来了。

先告诉所有人,停一下,我来记录一下当前状态。

告诉所有人,你们继续,该干嘛干嘛,我标记一下要用的对象

一开始所有点是白色,首先从根节点出发,标记相连的点为灰色(相连证明有引用),并且将所有灰色的点存起来;

告诉所有人,再停一下,在第二个过程中,因为所有人继续在工作,那么就会产生新的垃圾,因为第一个过程记录了状态,所以需要标记一下新的垃圾;然后清除所有白色的点,因为白色的点是没人引用的,也就是垃圾。

你一定会有这样的疑问:

那么既然会导致那么多问题,为什么不直接停下来,标记完回收完了再开始呢?
因为慢~

所以这样GC的原因是既要保证GC正常执行,又要保证效率,不能停的时间太长。

其实第一次停的时候,启动了一个写屏障 (write barrier)它需要记录后续过程中新创建的对象

这个过程称为三色标记,有点类似广度优先搜索。

这次是必须停,因为在第二个过程中引用会发生变化,从而需要停止后重新扫描一遍;然后关闭写屏障,最后再清理。

开启写屏障时需要stw
关闭写屏障前需要stw


开启写屏障之后的标记过程与其他程序并发执行
关闭写屏障之后的清扫过程与其他程序并发执行

那毕竟GC还是需要STW的,虽然可能停止时间很短,但是对于程序来说,整个程序停止1秒那对于用户来说就是致命打击。所以GC肯定需要一个触发的条件,不能想来就来。

这是一个触发的条件,默认GC百分比设置的是100,意思是,如果这次回收之后总共占用2M的内存,那么下次触发的条件时当超过4M的时候;同理,当这次回收之后总共占用4M,那么下次触发条件就是8M。

这个简单,当一定时间(2分钟)没有执行过GC就触发GC

使用命令 runtime.GC() 手动触发GC

以上就是在golang中垃圾回收的大致流程,总的来说使用三色标记法进行标记清除,并且标记时与程序运行并行,为了解决问题使用写屏障来记录标记过程中对象的变更。总来的来说也是为了提高垃圾回收的效率,并且尽可能的减少STW的时间。
了解下来,与java的分代回收相比,golang中的回收算法理解起来更加简单一些。

https://studygolang.com/articles/21569
https://spin.atomicobject.com/2014/09/03/visualizing-garbage-collection-algorithms/
https://www.jianshu.com/p/8b0c0f7772da
http://legendtkl.com/2017/04/28/golang-gc/

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
word文档怎么设置页码word怎么从中间开始设置页码 《祖宗模拟器》如何长寿长寿技巧分享 祖宗模拟器答案大全,你知道吗。 祖宗模拟器答案大全,哪位有? 宝石种类分为哪几类? 表格怎么自动排序号excel表格中自动生成序号技巧 表格如何自动排序仅需4步让Excel表格自动排序的方法 1.5匹富士空调电脑板开机就烧保险丝 为什么 修空调只是把拆了个压敏电阻,虽然可以运行,但这样没问题吗? 1.5富士空调电脑板一通电就烧保险丝为什么 golang atomic包 跪求,歌词为天上掉下个林妹妹,似一朵轻云刚出岫的歌谢谢 哺乳期怎么吃,乳汁才能营养均衡不影响宝宝发育?? 平安是福的微信记录, 平安是福 健康为本 平安是福用微信名好吗 ...比如设置从第4秒开始截取 但是转换后以后是从第10秒开始截取的_百度... 南京眼亮化亮灯到几号? 南京河西金鹰亮化一晚上多少钱? 英语介绍菲律宾 产妇哺乳期食谱 谁精通移动wlan业务?怎样注销业务啊?本地wlan通信费是不是这个业务的... wifi本地通信费指什么 白羊座女生面对追求者的态度 让白羊座骄傲的年龄 玩心最大,白羊座女生不同年龄段对相亲的态度有哪几种? 孩子好动注意力不集中是缺什么还是什么 家长需要怎么做 子公司承接母公司项目如何变更项目 如何将平行的两个全资子公司变成母分关系?工商注册怎么处理? 子公司脱离母公司需要什么步骤? 曾志伟和徐帆演了一部电视剧叫什么名孑 富士康g17四楼是干嘛的 《风吹半夏》里的插曲其实你不懂我的心是谁唱的? 为什么富士康g3没有g2工资高 富士康g31无法重装系统 我想开家水族馆,经销热带鱼,锦鲤等水宠物。怎么进货渠道?和养殖。_百 ... 给别人担保影响自己征信吗 沙海盒子里装的是什么?寄生虫来历神秘 沙海盒子里的黑东西是啥 沙海里面那个生化危险物质的容器是什么 沙海中黎簇为什么开局老看见死人 沙海中黄严为什么会疯 沙海吴邪在地下室经历了什么 mac 重启后 XAMPP下的apache无法启动 XAMPP数据库启动,Admin点了后报错。 空气能量子双能是什么意思? 宝宝健康成长的秘诀,不吃两饭、不睡三觉,宝妈可以学起来 怎样保证宝宝的健康发育 wireshark1.4.9中文版怎么看端口号啊 法利安车品是什么牌子,夏季汽车坐垫如何