内存泄漏程序
内存泄漏是一种重复分配程序的错误,程序使用了内存却不释放它。
长时间运行的程序(如交互式应用程序)如有内存泄漏则是一个严重的问题,因为它可能产生内存碎片,且实内存和页面空间中可能会堆积大量的主要充满无用信息的页面。 从而得知系统因为单个程序中的内存泄漏而用尽页面空间。
内存泄漏可以用 svmon 命令来检测,它会寻找工作段一直在增加的进程。 内核段的泄漏可能是 mbuf 泄漏、设备驱动程序、扩充内核甚至内核引起的。 要确定分段是否正在增长,请使用带有 -i 选项的 svmon 命令来查看一个或一组进程,并查看是否有任何分段继续增长。
识别违例的子例程或者代码行更为困难,特别是在 AIXwindows 应用程序中,这些应用程序会生成大量的 malloc() 和 free() 调用。 C++ 提供了 HeapView Debugger 来分析和调整内存的使用和泄漏。 有一些第三方程序可以分析内存泄漏但它们需要程序访问源代码。
一些 realloc() 子例程使用时,可能并非真正的编程错误,也会造成和内存泄漏一样的效果。 如果一个程序经常使用 realloc() 子例程来增加数据区域的大小,而且存储由 realloc() 子例程释放的内存不能重用于其他方面,进程的工作段可能越来越多地变成碎片。
使用 disclaim() 系统函数 free() 调用函数来释放不再需要的内存。 disclaim() 系统调用必须在 free() 调用之前调用。 如果程序马上就要结束,在最后调用 malloc() 函数会浪费内存。 当程序终止时,它的工作段被破坏并且含有工作段数据的实内存页帧被添加到空闲列表。 以下示例是内存泄漏程序,其中Inuse,Pgspace和Address Range私有工作段的值在不断增长:
# 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 2357
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/prodlv:4097 - 2 0 - -
ginger :svmon -P 13548 -i 1 3
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/prodlv: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/prodlv:4097 - 2 0 - -