在上一节 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泄露排查 中我们总结的方法和工具,即可快速定位和解决内存泄漏问题。这里就不再赘述。