博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何在系统中查找内存泄漏(memory leak)程序?
阅读量:2185 次
发布时间:2019-05-02

本文共 2893 字,大约阅读时间需要 9 分钟。

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

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

转载地址:http://pqmkb.baihongyu.com/

你可能感兴趣的文章
【LEETCODE】112-Path Sum
查看>>
【LEETCODE】9-Palindrome Number
查看>>
【极客学院】-python学习笔记-Python快速入门(面向对象-引入外部文件-Web2Py创建网站)
查看>>
【LEETCODE】190-Reverse Bits
查看>>
【LEETCODE】67-Add Binary
查看>>
【LEETCODE】7-Reverse Integer
查看>>
【LEETCODE】165-Compare Version Numbers
查看>>
【LEETCODE】299-Bulls and Cows
查看>>
【LEETCODE】223-Rectangle Area
查看>>
【LEETCODE】12-Integer to Roman
查看>>
【学习方法】如何分析源代码
查看>>
【LEETCODE】61- Rotate List [Python]
查看>>
【LEETCODE】143- Reorder List [Python]
查看>>
【LEETCODE】82- Remove Duplicates from Sorted List II [Python]
查看>>
【LEETCODE】86- Partition List [Python]
查看>>
【LEETCODE】147- Insertion Sort List [Python]
查看>>
【算法】- 动态规划的编织艺术
查看>>
用 TensorFlow 让你的机器人唱首原创给你听
查看>>
对比学习用 Keras 搭建 CNN RNN 等常用神经网络
查看>>
深度学习的主要应用举例
查看>>