← 返回首页
Go语言在什么情况下会发生内存泄漏?
以下是一些内存泄漏的常见场景:
goroutine泄漏:这是最常见的泄漏场景。goroutine没有正常退出会一直占用内存,比如从channel读取数据但channel永远不会有数据写入,或者死循环没有退出条件。我在项目中遇到过,启动了处理任务的goroutine但没有合适的退出机制,导致随着请求增加goroutine越来越多。
channel泄漏:未关闭的channel和等待channel的goroutine会相互持有引用。比如生产者已经结束但没有关闭channel,消费者goroutine会一直阻塞等待,造成内存无法回收。
slice引用大数组:当slice引用一个大数组的小部分时,整个底层数组都无法被GC回收。解决方法是使用copy创建新的slice。
map元素过多:map中删除元素只是标记删除,底层bucket不会缩减。如果map曾经很大后来元素减少,内存占用仍然很高。
定时器未停止:time.After或time.NewTimer创建的定时器如果不手动停止,会在heap中持续存在。
循环引用:虽然Go的GC能处理循环引用,但在某些复杂场景下仍可能出现问题。