Linux用户进程内存泄露一种检测方法

像使用C/C++内存管理器不会帮我们自动回收不再使用的内存,如果忘记释放不再使用的内存而不能再被重用,就造成了所谓的内存泄露。

         在Linux中,用户进程在/proc/{pid}/status文件中记录了该进程的内存使用实时情况。

         * VmSize:

      虚拟内存大小。

      整个进程使用虚拟内存大小,是VmLib, VmExe, VmData, 和 VmStk的总和。

    * VmLck:

      虚拟内存锁。

      进程当前使用的并且加锁的虚拟内存总数

    * VmRSS:

      虚拟内存驻留集合大小。

      这是驻留在物理内存的一部分。它没有交换到硬盘。它包括代码,数据和栈。

    * VmData:

      虚拟内存数据。

      堆使用的虚拟内存。

    * VmStk:

      虚拟内存栈

      栈使用的虚拟内存

    * VmExe:

      可执行的虚拟内存

      可执行的和静态链接库所使用的虚拟内存

    * VmLib:

      虚拟内存库

      动态链接库所使用的虚拟内存

 

         我们可以写个脚本,把你关注的进程或者所有的进程(ps –ef),的内存使用情况,主要针对VmSize,VmData,VmStk三个方面每隔比如3小时记录到进程号对应的文件中,每次记录下一个的时候,做 个比较,如果发现最后一个记录点比第一个记录点小无内存泄露,如果大还需要与第二个记录点的大小(排除系统启动时的内存增长需要时间稳定下来),如果大的 话就说明有内存泄露。还有记录点不要太多,比如30个,超过了就删除除了第一个记录点外的倒数第二个老的记录点。检测出内存泄露,可以打到异常日志中,供 查看。

         我们需要去查看那日志,发现有泄露,会看是什么原因的,至少可以知道是哪个进程的以及是栈还是堆上的,然后再分析代码…

posted @ 2015-03-01 02:17  alxe_yu  阅读(4637)  评论(0编辑  收藏  举报