内存泄露排查

* 本页面主要介绍内存泄露排查的相关内容。

在上一节 Goroutine泄露排查 中,我们总结了Go语言程序中常见的Goroutine泄露的原因及如何避免和排查。 这一节我们关注的是内存泄漏(Memory Leak)。不知道你有没有听过一句话:

10次内存泄露,有9次是goroutine泄露。

这句话形象的表达出了内存泄漏的最大罪魁祸首:Goroutine泄露!所以,关于对内存泄露的分析和避免,侧重点就又来到了对Goroutine的认知和处理上。

一、内存泄露的定义

我们需要明确这两个经常听到的名词的区别:

  • 内存溢出(Out Of Memory):机器最大提供8GB内存空间,你需要10GB内存方能运行(要多了,给不起)
  • 内存泄漏(Memory Leak):机器最大提供8GB内存空间,你要8GB内存来用,但是用起来就不归还了(要到了,不退还)

内存泄漏久了,慢慢的也会导致最终的内存溢出!所以,尽早定位造成内存泄漏的原因,排除掉内存泄漏的隐患,才是我们核心要关注的问题。

二、Go程序中的“内存泄漏”

通过 高并发原理 一节,我们知道了Go语言中的并发是以 goroutine (独立活动) 和 channel (用于通信)的形式实现的。一旦goroutine使用不得当(死循环等),就可能造成goroutine泄漏,进而造成内存泄漏,最终耗尽内存,从而导致崩溃。虽然我们知道goroutine初始化时仅会分配约2kb大小的栈空间,但是如果大量的goroutine被阻塞,造成的内存浪费也是非常大的。

所以,通过 Goroutine泄露排查 中我们总结的方法和工具,即可快速定位和解决内存泄漏问题。这里就不再赘述。


* 本页内容参考以下数据源:

  • 《Go程序设计语言》
  • https://www.zhihu.com/question/40560123
  • https://blog.csdn.net/weixin_30388677/article/details/101388930

凯冰科技 · 代码改变世界,技术改变生活
下一篇:字符编码 →