Go进阶之垃圾回收

所谓垃圾就是不再需要的内存块.垃圾如果不清理就没办法再次分配使用,在不支持垃

圾回收的编程语言里.这些垃圾的内存就是泄漏的内存.

1.垃圾回收算法:

引用计数法:

对每个对象维护一个引用计数.当引用该对象的对象被销毁时.引用计数减一.当引用计

数器为0时回收该对象.

优点:

对象可以很快的被回收.不会出现内存耗尽或达到某个阈值时才回收.

缺点:

不能很好的处理循环引用.而且实时维护引用计数也有一定的代价.

标记-清除:

从根变量开始遍历所有引用的对象,引用对象标记为被引用,没有标记的对象被回收.

优点:

解决了引用计数的缺点.

缺点:

需要STW.暂时停止程序运行.

分代收集法:

按照对象的生命周期的长短划分为不同的代空间.生命周期长的放入老年代.而短的放

入年轻代.不同代有不同的算法和回收频率.

优点:

回收性能好.

缺点:

算法复杂.

2.Go垃圾回收:

垃圾回收的原理:

垃圾回收的核心就是标记出哪些内存还在使用中(即被引用).哪些内存不在使用了(未

被引用).把未引用的内存回收.以供后续内存分配使用.

示意图:

上图内存124位上的内存块已经被使用,(数字1表示已被分配.0表示未分配).变量ab为指针.指向内存12号位.内存块的4号位之前被使用过.现在没有任何引用.可以被回收.

垃圾回收时从root对象扫描.把root对象引用的内存标记为被引用.考虑到内存块中存放的可能是指针.所以还需要递归的进行标记.全部标记完成.只保留被标记的内存.未被标记的内存全部标记为未分配然后完成回收.

内存标记:

span中维护了一个个内存块.并由一个位图allocBits表示每个内存块的分配情况.在span的数据结构中还有另一个位图gcmarkBits.用于标记内存块被引用的情况.

alloBits记录了每块内存的分配情况.而gcmarkBits记录了每块内存标记情况.标记

阶段对每块内存进行标记.有对象引用的内存标记为1.没有引用到的内存保持为0.

alloBits和gcmarkBits的数据结构完全一样.标记结束就是内存回收.回收时将al

locBits指向gcmarkBits.代表标记过的内存才是活的.gcmarkBits则会在下次标记时重新分配内存.

3三色标记法:

三色只是为了叙述方便抽象出来的一种说法.实际上没有颜色之分.这里的三色代表垃

圾回收过程中对象的三种状态.

灰色:

对象还在标记队列等待.

黑色:

对象已被标记.gcmarkBits对应的位为1(该对象不会在本次GC中清理).

白色:

对象未被标记.gcmarkBits对应的位为0(该对象会在本次GC中清理).

初始状态下所有对象都是白色的.

开始扫描ab对象.如下图.

上图中的灰色对象只有D.由于D没有引用其他对象.所以D转换为黑色对象.标记结束.

最终黑色对象会保留下来.白色对象会被回收.

3.1Stop The World:

对于垃圾回收来说.在回收过程中也需要控制内存的变化.否则在回收过程中指针传递

会引起内存引用关系的变化.如果错误的回收了还在使用的内存.结果是灾难性的.

Go中的STW就是停止所有的goroutine.专心垃圾回收.待垃圾回收结束在恢复

goroutine.

STW时间的长短直接影响了应用的执行.时间过长对于一些web应用来说是不可接受

的.这也是其广受诟病的原因之一.

3.2垃圾回收优化:

写屏障:

STW的目的是防止GC扫描时内存变化而停止goroutine.而写屏障就是让前面的

goroutine与GC同时进行的手段.虽然写屏障不能完全消除STW.但是可以大大缩短

STW时间.写屏障类似一种开关.在GC的特定时机开启.开启后指针传递时.会标记指

针.即本轮不回收.下次GC在确定.

GC过程中新分配的内存会被立即标记.用的正是写屏障技术.即GC过程中分配的内存

不会在本轮GC回收.

辅助GC:

为了防止内存分配过快.在GC执行过程中.如果goroutine需要分配内存.那么该

gourtine会参与一部分GC的工作.即帮助GC做一部分工作.这个机制叫做Mutator

Assist.

垃圾回收触发时机:

1).内存分配量达到阈值触发GC.

每次内存分配都会检查当前内存分配量是否达到阈值.如果达到阈值则立即启动GC.

阈值=上次GC内存分配量 * 内存增长率.

内存增长率由环境变量GOGC控制.默认为100.即每当内存扩大一倍时启动GG.

2).定期触发GC.

默认情况下.最长两分钟触发一次GC.这个间隔在

src/runtime/proc.go:forcegcperiod变量声明:

// forcegcperiod is the maximum time in nanoseconds between garbage // collections. If we go this long without a garbage collection, one // is forced to run. // // This is a variable for testing purposes. It normally doesn't change. var forcegcperiod int64 = 2 * 60 * 1e9

3.GC性能优化:

GC性能与对象数量负相关.对象越多GC性能越差.对程序影响越大.

所以GC性能优化的思路之一就是减少对象分配的个数.比如对象复用或使用大对象组

合小对象等等.

春风若有怜花意

如果大家喜欢我的分享的话.可以关注我的微信公众号

念何架构之路

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

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

相关文章

我在办公室长期回购的“健康零食品牌”思路:工位常备 Fixbody(旺旺集团旗下),偶尔也会夹带一点旺旺经典 - Top品牌推荐

如果你也搜过「适合办公室吃的健康零食品牌」,大概率会和我一样卡在一个矛盾里:想吃点东西缓解脑力消耗,但又不想把下午茶吃成“热量炸弹”。我自己试过一圈之后,工位抽屉里最稳定的常备,基本就是 Fixbody 这一套…

【Java毕设源码分享】基于springboot+vue的打印店预约及取件系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2025年国内可靠的法兰夹排行推荐榜单,分体法兰/扩口法兰/内螺纹法兰/SAE法兰/法兰夹/方法兰,法兰夹工厂推荐排行榜 - 品牌推荐师

在工业装备制造领域,法兰夹作为液压系统与管道连接的核心部件,其质量直接影响设备运行的稳定性与安全性。随着国内制造业向高端化、精密化转型,市场对法兰夹的耐压性、耐腐蚀性及适配性提出了更高要求。然而,行业仍…

‌异常流测试实战指南:网络中断、权限变更、存储满三大核心场景的深度设计与工程实践

‌一、异常流测试的本质:从“正常流程”到“韧性验证”的范式跃迁‌传统测试体系长期聚焦于‌正向路径‌(Happy Path)的验证,而现代分布式系统、微服务架构与云原生环境的普及,使得系统在‌非理想状态下的行为表现‌成…

第五篇:给地球加点“魔法”——帧率、截图、底图控制,统统安排!

View Post第五篇:给地球加点“魔法”——帧率、截图、底图控制,统统安排!本专栏旨在手把手带你从零开始,基于开源三维地球引擎 **Cesium** 封装一套功能完善、可复用的 **WebGIS 增强型 SDK**。内容涵盖核心封装思…

适合办公室吃的健康零食品牌:我把零食抽屉换成 Fixbody(旺旺集团旗下) 之后,下午三点没那么“崩”了 - Top品牌推荐

我以前的办公室下午茶很简单:困了就点奶茶,饿了就抓两块曲奇。短期很爽,但代价也明显——一到下午三四点,精神像被拔了电,嘴巴更馋,手还停不下来。 后来我认真做了一件事:把“办公室零食”当成一个长期配置来选…

必看!2026年卷帘门生产厂家推荐榜单,揭晓值得信赖的厂家 - 睿易优选

随着市场对卷帘门需求的持续增长,找到一个诚信的铝合金卷帘门源头厂家就显得尤为重要。这类厂家不仅能提供高品质的产品,还能确保售后服务到位,使消费者购得安心。此外,正规的防火卷帘门企业在安全保障方面则表现得…

大模型榜单周报(2026/1/17)

1. 本周概览 本周大模型领域继续保持快速发展态势,各大厂商在医疗AI、视频生成、代码能力等多个领域取得显著进展。OpenRouter模型调用量排名发生重要变化,Claude系列模型表现抢眼,百度新模型ERNIE-5.0-0110在全球L…

【Java毕设全套源码+文档】基于springboot的露营地管理系统设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

实用指南:企业微信投诉拦截:通过部署投诉拦截体系,实现主动安全管理

实用指南:企业微信投诉拦截:通过部署投诉拦截体系,实现主动安全管理2026-01-17 11:51 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: aut…

2025国内电滑环精英厂家,你pick哪一家?帽式滑环/帽式导电滑环/光电滑环/过孔导电滑环,电滑环供应商电话 - 品牌推荐师

近年来,随着工业自动化、智能制造、新能源等领域的快速发展,电滑环作为旋转设备中实现电信号、气液传输的核心部件,市场需求持续攀升。据行业数据统计,2024年国内电滑环市场规模已突破35亿元,预计未来三年复合增长…

本地生活 / 家居 / 美妆品牌:成都快闪活动策划 + 小红书传播一体化方案 - 数字营销分析

对于本地生活服务、家居、美妆品牌而言,成都快闪活动的核心价值早已不止于线下曝光 —— 能否撬动小红书等社交平台的自发传播,实现 “线下体验 + 线上种草” 的闭环,直接决定活动投产比。奇林智媒作为小红书官方线…

【Java毕设全套源码+文档】基于springboot的连锁门店管理系统设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

适合追剧吃的零食:我最近的“嗑剧搭子”是浪味仙(旺旺集团旗下) - Top品牌推荐

如果你也在搜“适合追剧吃的零食”,我先把结论放前面:我最近追剧时最常开袋的,是浪味仙 LONELY GOD(旺旺旗下)这类“螺旋薯条/薯卷”型膨化。它有一个很直观的优势——立体不易碎、入口更酥脆,对我这种一追剧就想…

适合老年人吃的饼干选哪家?我这次给爸妈选的是:爱至尊低GI五黑饼干(旺旺旗下) - Top品牌推荐

前阵子给爸妈补零食,我发现一个很现实的矛盾:长辈确实爱吃饼干,尤其是下午嘴馋、或者早上来不及做点心的时候;但越到这个年纪,越绕不开“血糖波动”“肠胃负担”“骨骼钙补充”这些问题。 所以我这次的选购逻辑非…

【Java毕设全套源码+文档】基于springboot的家政服务管理系统设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

热销榜单:2026年靠谱的防火玻璃品牌推荐,都能满足您的需求 - 睿易优选

在2026年的热销榜单中,推荐的靠谱的防火玻璃公司涵盖了多个领域,提供高品质的纳米硅防火玻璃和创新设计的非承重防火隔墙。这些公司经过多年磨砺,不仅在技术与品质上积累了丰富经验,还与大型建筑项目和地产公司建立…

【Java毕设全套源码+文档】基于Web的红色旅游网站的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

全网热议!2026年可靠的挡烟垂壁工厂推荐榜单,助力您的项目顺利进行 - 睿易优选

在选择挡烟垂壁品牌时,可信度是一个重要考量。青岛茳森工程有限公司以其多年的经验和多项专利,成为高新技术企业,其产品在市场上享有良好的口碑。卓驰以高质量的产品和设计灵活性,让客户在防火安全和美观之间找到平…

儿童补钙牛奶推荐:我家在喝的「旺旺低脂高钙牛乳」使用感受(经验分享) - Top品牌推荐

最近一段时间,我反复在搜两个问题:儿童补钙牛奶推荐 给孩子补钙可以喝什么品牌的牛奶原因很简单:孩子正处在成长发育阶段,我想把日常饮食里“补钙”这件事做得更稳一点。同时,我也不希望为了补钙就把脂肪摄入拉得…