go语言的垃圾回收

go语言的垃圾回收

垃圾回收就是对程序中不再使用的内存资源进行自动回收的操作

常见的垃圾回收算法:

引用计数:每个对象都维护一个引用计数,当被引用对象创建或者被赋值给其他对象时引用计数自动加1,如果对象被销毁,则计数-1,当计数为0时,回收该对象

优点:对象可以很快被回收,不会出现内存耗尽或者达到阀值才回收

缺点:不能很好的处理循环引用

标记-清除:从根变量开始遍历所有引用的对象,引用的对象标记"被引用,没有被标记的则进行回收。

优点:解决了引用计数的缺点

缺点:需要stw,暂时停止了程序运行

分代收集:按照对象生命周期长短划分不同的代空间,生命周期长的放入老年代,短的放入新生代,不同代有不同的回收算法和回收频率

优点:回收性能好

缺点:回收算法复杂

三色标记法:

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

从根节点开始遍历所有对象,把遍历到的对象变成灰色对象

遍历灰色对象,将灰色对象引用的对象也变成灰色对象,然后将遍历过得灰色对象变成黑色对象

循环步骤3,直到灰色对象全部变成黑色

通过写屏障检测对象有变化,重复以上操作

收集所有白色对象(垃圾)

STW

为了避免GC过程中,对象之间的引用关系发生新的变更,使得GC的结果发生错误(如GC过程中新增了一个引用。但是由于未扫描到该引用导致将被引用的对象清除了),停止所有正在运行的协程

STW对性能有一些影响,Golang目前已经可以做到1ms以下的STW

写屏障

为了避免GC的过程中新修改的引用关系到GC的结果发生错误,我们需要进行STW。但是STW会影响程序的性能,所以我们要通过写屏障技术尽可能的缩短STW的时间

造成引用对象丢失的条件:

一个黑色的节点A新增了指向白色节点C的 引用,并且白色节点c没有除了A之外的其他灰色节点的引用,或者存在但是在GC过程中被删除了。

以上两个条件需要同时满足:满足条件1时说明节点A已扫描完毕,A指向C的引用无法再被扫描到

满足条件2时说明白色节点C无其他灰色节点的引用了,即扫描结束后会被忽略

写屏障破坏两个条件其一即可

破坏条件1:Dijistra写屏障

满足强三色不变形:黑色节点不允许引用白色节点 当黑色节点新增了白色节点的引用时,将对应的白色节点改为灰色

破坏条件2:Yuasa写屏障

满足弱三色不变性:黑色节点允许引用白色节点,但是该白色节点有其他的灰色节点间接的引用(确保不会被遗漏)当白色节点被删除了一个引用时,悲观的认为它一定会被一个黑色节点新增引用,所以将它置为灰色

作为求职者,当面试官问到垃圾回收时,我会回答如下:

垃圾回收是一种自动内存管理技术,用于检测和回收不再使用的内存资源,以避免内存泄漏和内存溢出问题。常见的垃圾回收算法包括标记-清除算法、复制算法和标记-整理算法。

在Golang中,垃圾回收是由Go语言运行时系统(runtime)负责管理的。Golang的垃圾回收器使用了并发标记清除算法,即在程序运行过程中,垃圾回收器会标记所有活跃对象,并清除未被引用的对象。这个过程会通过并发执行来减少对应用程序的影响。

Golang的垃圾回收器有多个阶段,包括标记阶段、清除阶段和压缩阶段。标记阶段会从根对象开始,递归遍历所有可达对象,并标记为活跃对象。清除阶段会释放未被标记的内存空间。压缩阶段则会对内存进行整理,减少碎片化。

为了优化垃圾回收的性能,我们可以在代码层面上做一些优化。例如,尽量减少对象的创建和销毁,避免产生过多的临时对象;避免循环引用,以免形成无法回收的对象;合理设置垃圾回收的阈值参数,以平衡内存使用和性能。

在实际项目中,我也积累了一些经验。例如,通过分析内存使用情况,设置合适的垃圾回收参数,以满足应用程序的性能需求;在关键路径上尽量避免频繁的垃圾回收,可以通过对象复用等方式来减少垃圾回收的开销。

总结起来,垃圾回收是一种重要的内存管理技术,在Golang中有着高效、可预测性和适应性的优点。通过合理的代码编写和参数设置,可以优化垃圾回收的性能,提高应用程序的运行效率。

相关推荐
stormsha1 小时前
go-rod vs Selenium:自动化测试工具的比较与选择
python·selenium·测试工具·golang
hummhumm17 小时前
第 22 章 - Go语言 测试与基准测试
java·大数据·开发语言·前端·python·golang·log4j
hummhumm17 小时前
第 28 章 - Go语言 Web 开发入门
java·开发语言·前端·python·sql·golang·前端框架
YMWM_18 小时前
第一章 Go语言简介
开发语言·后端·golang
hummhumm19 小时前
第 25 章 - Golang 项目结构
java·开发语言·前端·后端·python·elasticsearch·golang
好奇的菜鸟19 小时前
Go语言中的引用类型:指针与传递机制
开发语言·后端·golang
Alive~o.019 小时前
Go语言进阶&依赖管理
开发语言·后端·golang
ifanatic1 天前
[面试]-golang基础面试题总结
面试·职场和发展·golang
懒是一种态度1 天前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
XINGTECODE1 天前
海盗王集成网关和商城服务端功能golang版
开发语言·后端·golang