像使用C/C++内存管理器不会帮我们自动回收不再使用的内存,如果忘记释放不再使用的内存而不能再被重用,就造成了所谓的内存泄露。
在Linux中,用户进程在/proc/{pid}/status文件中记录了该进程的内存使用实时情况。
* VmSize:
虚拟内存大小。
整个进程使用虚拟内存大小,是VmLib, VmExe, VmData, 和 VmStk的总和。
* VmLck:
虚拟内存锁。
进程当前使用的并且加锁的虚拟内存总数
* VmRSS:
虚拟内存驻留集合大小。
这是驻留在物理内存的一部分。它没有交换到硬盘。它包括代码,数据和栈。
* VmData:
虚拟内存数据。
堆使用的虚拟内存。
* VmStk:
虚拟内存栈
栈使用的虚拟内存
* VmExe:
可执行的虚拟内存
可执行的和静态链接库所使用的虚拟内存
* VmLib:
虚拟内存库
动态链接库所使用的虚拟内存
我们可以写个脚本,把你关注的进程或者所有的进程(ps –ef),的内存使用情况,主要针对VmSize,VmData,VmStk三个方面每隔比如3小时记录到进程号对应的文件中,每次记录下一个的时候,做 个比较,如果发现最后一个记录点比第一个记录点小无内存泄露,如果大还需要与第二个记录点的大小(排除系统启动时的内存增长需要时间稳定下来),如果大的 话就说明有内存泄露。还有记录点不要太多,比如30个,超过了就删除除了第一个记录点外的倒数第二个老的记录点。检测出内存泄露,可以打到异常日志中,供 查看。
我们需要去查看那日志,发现有泄露,会看是什么原因的,至少可以知道是哪个进程的以及是栈还是堆上的,然后再分析代码…