您的位置:首页 > 运维架构 > Linux

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

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

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

         * VmSize:

      虚拟内存大小。

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

    * VmLck:

      虚拟内存锁。

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

    * VmRSS:

      虚拟内存驻留集合大小。

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

    * VmData:

      虚拟内存数据。

      堆使用的虚拟内存。

    * VmStk:

      虚拟内存栈

      栈使用的虚拟内存

    * VmExe:

      可执行的虚拟内存

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

    * VmLib:

      虚拟内存库

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

 

1、VmSize:当前procid使用的虚拟内存数。如果此值很高则表示当前内存存在不足,只有物理内存不足的情况下OS才会使用虚拟内存
2、VmRSS:当前procid使用的物理内存量
3、VmD:当前procid使用的heap内存的量

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

         我们需要去查看那日志,发现有泄露,会看是什么原因的,至少可以知道是哪个进程的以及是栈还是堆上的,然后再分析代码…
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: