Linux下如何发现内存泄漏问题(测试角度)

一、内存泄漏的概念

内存泄漏指的是由于疏忽或错误造成程序未能释放已经不再使用的内存。

所以它并非指内存在物理上的消失,而是由于失去控制而造成的内存浪费。

按发生的方式来分类,内存泄漏可以分为4 类:

    常发性内存泄漏。发生内存泄漏的代码会被多次执行,每次执行都会导致一块内存泄漏。 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生,与常发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块且仅有一块内存发生泄漏。 隐式内存泄漏。程序在运行过程中不停地分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,但是对于一个需要运行几天,几周甚至几个月的程序来说,不及时释放内存也可能导致最终耗尽系统的所有内存。

二、测试方法

1、长期稳定性测试

保证软件至少运行7*24小时,测试过程中有持续的数据变化。

2、大数据量测试

这里的大数据量不仅指总数据量大,也包括单个数据的数据量大,比如单块磁盘大小超过2TB、单个虚拟机数据量超过4TB。

但大数据量只是发现内存泄漏问题的充分不必要条件。

3、结合free、top等命令进行资源监控

free命令:

top命令:第四行展示的是内存总量、内存使用量、空闲内存以及块设备缓冲。

也可以看到待监控进程的内存占用百分比。如果这里的内存占用百分比增速过快,则需要考虑是否存在内存泄露的问题。

4、持续观察上层应用运行情况

在长期和大数据量环境下,内存泄漏可能会导致上层应用卡死、应用进程被kill等现象。此时可以通过日志查看是否与内存有关。

5、查看日志

如下图是从messages中获取到的,因为应用进程的内存占用过高(165G)导致进程被kill的日志信息:

同样的,也可以查看更详细的应用日志。应用程序一般使用malloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块。如下图如果无法一一对应,则可能存在内存泄漏:

6、检查代码

测试人员已经判断代码中可能存在内存泄漏问题,那接下来就可以找开发人员定位具体的内存泄漏位置并修复问题了。

我在网上看到很多专门用于内存检测的工具,还需要继续学习学习。

经验分享 程序员 微信小程序 职场和发展