Golang Go语言中帮我看看这种写法会导致内存泄漏吗?

发布于 1周前 作者 yibo5220 来自 Go语言

type X struct { a string b string }

type XS struct { x []X time time.Time }

var ( global = make(map[string]*XS, 0) )

func goLoop() { .... p := make([]X, 0) ....mysqlDB.where("123").find(&p).... global["123"] = &XS{ time:time.Now(), x:p, } ... } 帮我看看这种写法会导致内存泄漏吗?

代码如上

情况一、假如每秒都会起很多个 goLoop()协程,它很快就会执行完毕(不会出现它被阻塞的情况),协程退出。 现象:通过 k8s 的 top pod 命令发现程序占用的内存在稳步上升,仅仅几个小时,从最开始的个位数,上升到 200+。

情况二、内存上升到 200+后,停止新调用 goLoop()。然后等待几个小时 现象:内存先是稍微下降一点点,然后一直维持到 200+。

按理说用过了的变量会被系统自动 GC 的呀,上面的代码我怎么看都没发现哪里有内存泄漏。


Golang Go语言中帮我看看这种写法会导致内存泄漏吗?

更多关于Golang Go语言中帮我看看这种写法会导致内存泄漏吗?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

打开 Profile 看看不就行了?

更多关于Golang Go语言中帮我看看这种写法会导致内存泄漏吗?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


楼上说得对,遇到问题应该先检索一下官方已经提供了哪些可用手段。

我看你这个 global map 一直在写,是不是它的原因?

另外学一下贴代码吧

多 routine 写 global map 不加锁?没报 panic?

你是用 global 全局变量做本地缓存吧?你的 global 只添加数据不删除数据,当然不会回收呀。

在Go语言中,判断代码是否会导致内存泄漏主要依赖于对内存分配和释放的理解,以及Go运行时对垃圾回收(GC)的机制。

首先,Go语言的垃圾回收器会自动管理内存,回收不再使用的对象。因此,大多数情况下,只要代码中没有显式的内存泄漏(如忘记释放资源或持有不必要的引用),就不会发生内存泄漏。

针对你提到的“这种写法”,没有具体的代码示例,我无法做出精确判断。但一般来说,以下几种情况可能会导致内存泄漏:

  1. 循环引用:如果两个或多个对象相互引用,且没有其他外部引用指向它们,这些对象可能无法被垃圾回收器回收。

  2. 全局变量或长生命周期变量持有短生命周期对象的引用:这会导致短生命周期对象无法被及时回收。

  3. 未关闭的资源:如文件、网络连接、数据库连接等,如果没有正确关闭,会导致资源泄漏,虽然这严格意义上不是内存泄漏,但会消耗系统资源。

  4. 大量使用goroutine且未正确管理:如果创建了大量的goroutine而没有适当的同步机制或停止条件,可能会导致资源消耗过大,间接导致系统性能下降。

为了更准确地判断是否存在内存泄漏,建议提供具体的代码示例,或者使用Go的内存分析工具(如pprof)来检查内存使用情况。

回到顶部