多种类型的内存泄漏分析方案

108 阅读2分钟

内存泄漏

内存泄漏(Memory Leak)是指程序中已动态分配的堆内存,由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

内存泄漏分类

内存泄漏可以分为 4 种类型,分别是常发性、偶发性、一次性和隐性。

1.常发性 发生内存泄漏的代码会被多次执行,每次被执行的时候都会导致一块内存泄漏。这种是比较好理解的,比如说我们有一个全局变量,在每次调用该部分业务逻辑时,都会导致该变量的数据增加,这就是常发性。这种问题一般比较好定位,只要在开发或者测试阶段就可以快速定位到。

2.偶发性 发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性也许就变成了常发性。比如虽然都是全局变量,A 逻辑只要调用就会增加,而 B 逻辑需要满足各种复杂条件后才会增加,那么 B 就是偶发性,而 A 就是上面的常发性。

3.一次性 发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块且仅一块内存发生泄漏。这种情况如果出现的次数不多,那么影响相对较小,比如说我们在启动 Node.js 服务后,require 并初始化了一个对象,但是并没有在程序中使用这个对象,我们知道在 Node.js require 的模块是会被缓存起来的,因此这也算是一种内存泄漏场景,只是这类场景影响非常有限。

4.隐性 在调用函数或者模块时,当参数或者输入没有达到界定值时,是不会发生泄漏,当参数或者输入值达到一定时,才会发现内存泄漏,我们称这种为隐性。举个简单的例子,比如我们要读取一个文件,当文件很小时,我们内存可以处理,但是当读取的文件非常大,则会导致内存异常问题,严格来说隐性的情况并不是内存泄漏,因为当程序调用结束后,还是会最终释放。

此文章为7月Day03学习笔记,内容来源于极客时间《Node.js开发实战》,强烈推荐该课程!