如何在系统中查找内存泄漏(memory leak)程序?

为什么系统内存足够的大,但当程序运行了一段时间后,系统还会报内存不够用,无法产生新进程? 当出现此种情况时,我们通常会还疑有内存泄漏。


首先回答什么是内存泄漏。 内存泄漏是一种程序错误,有内存泄漏的程序会不断向系统申请内存,然后使用所申请的内存,当不再使用这些内存时也不释放它们,其占用的内存量越来越大。如 果有内存泄漏的程序是一个长时间运行的应用程序,如交互式应用程序,这就会给系统带来非常严重的问题。 因为长时间的如此运行会导致内存的碎片,会在系统的实内存和换页空间中积聚大量内容无用的页面。
系统会由于一个程序有内存泄漏问题,最终造成服务器内存的匮乏而宕机或挂起。

在AIX中可以使用svmon , ps 命令来监测进程, 通过检查进程的工作段的变化来确定是否有内存泄漏现象。如果工作段不断在增加,则就是内存泄漏。


系统核心程序的泄漏是由 mbuf 泄漏、设备驱动程序、核心扩展(kernal extension)或核心自身引起的。

1. 为了确定是否有内存泄漏,使用svmon 命令中的 i 选项,来监测一个进程或一组进程,看其工作段空间是否在增加。


下面就是一个有内存泄漏的进程的例子,注意其私有工作段(private working segment) 的 inuse 不断在增加。


注:svmon 命令中各字段的单位是页面个数,不是KB。


#svmon –P 13548 –i 1 3
-------------------------------------------------------------------------------------------------------
Pid Command Inuse Pin Pgsp Virtual 64-bit Mthrd LPage
13548 pacman 8535 2178 847 8533 N N N

Vsid Esid Type Description LPage Inuse Pin Pgsp Virtual
0 0 work kernel seg - 4375 2176 847 4375
48412 2 work process private - 2357 2 0 2375
6c01b d work shared library text - 1790 0 0 1790
4c413 f work shared library data - 11 0 0 11
3040c 1 pers code,/dev/mattlv:4097 - 2 0 - -
-------------------------------------------------------------------------------------------------------
Pid Command Inuse Pin Pgsp Virtual 64-bit Mthrd LPage
13548 pacman 8589 2178 847 8587 N N N

Vsid Esid Type Description LPage Inuse Pin Pgsp Virtual
0 0 work kernel seg - 4375 2176 847 4375
48412 2 work process private - 2411 2 0 2411
6c01b d work shared library text - 1790 0 0 1790
4c413 f work shared library data - 11 0 0 11
3040c 1 pers code,/dev/mattlv:4097 - 2 0 -

Pid Command Inuse Pin Pgsp Virtual 64-bit Mthrd LPage
13548 pacman 8599 2178 847 8597 N N N

Vsid Esid Type Description LPage Inuse Pin Pgsp Virtual
0 0 work kernel seg - 4375 2176 847 4375
48412 2 work process private - 2421 2 0 2421
6c01b d work shared library text - 1790 0 0 1790
4c413 f work shared library data - 11 0 0 11
3040c 1 pers code,/dev/mattlv:4097 - 2 0 - -

2. 使用 ps vg 命令监测进程的内存使用情况。请注意命令结果中的SIZE 列中的值。它表示进程所使用的虚拟内存大小,单位是1KB。


如:


#ps vg |more


PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
0 - A 87:42 6 20 8 xx 0 0 0.1 0.0 swapper
1 - A 191:58 94 240 240 xx 25 28 0.3 0.0 /etc/init
516 - A 70228:47 0 16 20 xx 0 0 97.0 0.0 kproc
774 - A 5:53 1 24 28 xx 0 0 0.0 0.0 kproc
1032 - A 28:40 0 56 56 xx 0 0 0.0 0.0 kproc
1866 - A 0:00 0 24 20 xx 0 0 0.0 0.0 kproc
2174 pts/1 A 2:55 31 420 544 32768 260 164 0.0 1.0 aixterm

通过多次采集ps vg 的输出结果,比较相同进程的SIZE 值,确定进程内存的使用量是否在不断增加,判定是否有内存泄漏现象。

要 确定哪个子程序或代码行引起程序的内存泄漏是比较的困难,尤其是在AIXwindows 应用中,因为在此种应用中会有大量的malloc() 和 free() 调用。C++ 中提供的HeapView Debugger 可用来分析和调整内存的使用、检查内存泄漏,也有一些第三方的实用程序可用来分析应用程序的内存泄漏问题。 但这些都需要访问源代码。

使 用realloc()子程序调用的程序,虽然程序本身没有什么错误,但有时会引起如内存泄漏这样的负面影响。如果一个程序经常调用realloc() 子程序来增加数据区域的空间, realloc() 后剩余的存储空间太小不能再被利用, 则进程工作段(working segment)就会变得碎片有越来越多,占用的内存也逐渐增加。


使用disclaim()和free() 系统调用来释放不再需要的内存时,先使用disclaim()然后使用free()。
在系统中发现系统泄露程序后,要及时修正它,以免引起不必要的宕机。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值