go语言内存泄漏的场景分析
go本身自带的GC 是自动触发的 不需要我们人为干预 但是在某些场景下 还是会存在内存泄漏的问题
1 循环引用
如果存在两个或多个变量形成环式的相互引用 那么go的GC就无法通过三原色的方式 来完成对应变量的垃圾回收 这会是导致内存泄漏的场景之一
处理方法:这种场景多发生在数据结构间的互相引用 即互相持有对方的指针 这种我们一般在程序处理结束时 给对应位置赋空指针nil 来达到防止内存泄漏的目的,如果存在其他场景 可通过pprof的工具 来协助定位处理
2 全局变量
在go语言中 全局变量的生命周期是和程序完全相同的,通常直到程序结束才会被释放,因此 我们在开发的过程中 应尽量避免大量数据 被声明为全局变量 我们可以通过局部变量来替代全局变量,要明确的是 全局变量一般只适用于 需要多个模块共享的配置或者状态
处理方法:通过局部变量来替代全局变量;明确全局变量适用的场景
3 读取文件后 未及时关闭句柄
在go中 如果文件句柄未及时关闭 可能会导致内存泄露 甚至资源耗尽的问题,因为在go中 每打开一个文件 都需要分配一个文件句柄,如果没有及时关闭就会导致系统的文件描述符资源逐渐耗尽 最终导致无法打开新的文件 系统崩溃
处理方法:3.1 在每一个打开文件的方法内 定义一个defer函数 用于关闭文件 如:file.close() ;3.2 定义一个专门的打开文件的方法 统一打开统一关闭 防止遗忘
4 goroutine阻塞
在go中 如果goroutine被永久阻塞 是不会被自动关闭的 所以需要我们在编写程序是加上一个超时关闭goroutine 的 chan信号,以便阻止内存泄漏 说白了 就是给程序的select条件 加一个 case time.After() 函数来进行兜底关闭goroutine
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律