首页 > 系统相关 >go语言内存泄漏的场景分析

go语言内存泄漏的场景分析

时间:2024-09-13 12:14:03浏览次数:1  
标签:泄漏 场景 文件 内存 关闭 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

标签:泄漏,场景,文件,内存,关闭,go,全局变量
From: https://www.cnblogs.com/lovecatcher/p/18411972

相关文章

  • 2024年9月中国数据库流行度排行榜:TiDB重回前三,GoldenDB问鼎前五
    9月墨天轮数据社区的中国数据库流行度排行榜如约而至。除了冠亚两位,排名第三至第五的数据库产品均经历了位次的变动。榜单之上,稳健的老牌强者、崛起的新兴产品、以及那些在背后默默积蓄力量、准备厚积薄发的竞争者,共同展现了中国数据库行业的多样性和活力。墨天轮数据社区也持续致......
  • Go runtime 调度器精讲(三):main goroutine 创建
    原创文章,欢迎转载,转载请注明出处,谢谢。0.前言回顾下上一讲的内容。主线程m0蓄势待发,准备干活。g0为m0提供了执行环境,P和m0绑定,为m0提供活,也就是goroutine。那么问题来了,活呢?哪里有活给m0干?这一讲我们将介绍m0执行的第一个活,也就是maingoroutine。maingou......
  • Google 发布 DataGemma 技术减少 AI 生成错误信息 (即幻觉)
    Google推出了DataGemma,这是基于真实世界数据的两个新Gemma模型版本,旨在减少AI生成中的“幻觉”问题。DataGemma通过利用GoogleDataCommons中超过2400亿个来自可信来源的统计数据,显著提高了模型在处理数值和统计数据时的准确性。DataGemma采用了两种关键技术:检索......
  • 15. 三数之和 Golang实现
    给你一个整数数组nums,判断是否存在三元组[nums[i],nums[j],nums[k]]满足i!=j、i!=k且j!=k,同时还满足nums[i]+nums[j]+nums[k]==0。请你返回所有和为0且不重复的三元组。注意:答案中不可以包含重复的三元组。示例1:输入:nums=[-1,0,1,2,-1,-4]输出:[[......
  • mogodb学习
    安装MongoDB:直接官网安装即可。开启MongoDB服务:有2种方式:都是要去到bin目录下执行命令一是通过命令行:注意目录的形式执行成功后,会在保存数据库的目录:data/db中发现许多文件二是通过配置文件:先创建conf/mongod.conf配置文件的基本内容(用多了就会慢慢扩展):启动方式:mongo与m......
  • 【JUC】16-Java对象内存布局和对象头
    1.对象的内存布局 在HotSpot虚拟机里,对象在堆内存中的存储布局可以分为三个部分:对象头、实例数据和对齐填充。对象头:由对象标记和类型指针。......
  • Go语言SQL操作实战
    关注TechLead,复旦博士,分享云服务领域全维度开发技术。拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,复旦机器人智能实验室成员,国家级大学生赛事评审专家,发表多篇SCI核心期刊学术论文,阿里云认证的资深架构师,上亿营收AI产品研发负责人。Go语言凭借其高效、简单的特性,逐......
  • Google Aviator Evaluator 使用入门(一)
    Aviator Evaluator 使用入门(一)https://www.yuque.com/boyan-avfmj/aviatorscript/tvahat一、什么是规则引擎定义:规则引擎是一种软件系统,用于执行基于规则的推理。它将业务规则与事实数据相结合,得出结论。组成:规则引擎通常由规则存储库、推理引擎、工作内存 3个部分......
  • 内存耗尽后,Redis会发生什么?
    前言 作为一台服务器来说,内存并不是无限的,所以总会存在内存耗尽的情况,那么当Redis服务器的内存耗尽后,如果继续执行请求命令,Redis会如何处理呢?  2内存回收 使用Redis服务时,很多情况下某些键值对只会在特定的时间内有效,为了防止这种类型的数据一直占有内存,我们可以......
  • 项目完成小结:使用DjangoStarter v3和Taro开发的微信小程序
    前言不知不觉已经九月了,又到了一年的开学季,我每年都想做的项目墙甚至连个影子都没有…......