cs_jianwang的专栏

生于忧患,死于安乐!

-内存泄露初探-

某次面试,被问及内存泄露相关事宜,当时瞠目结舌,故现对此话题比较敏感。

(1)WHAT 什么是内存泄露?

 部分内存不在程序的管理范围内了,即脱离了管理。

(2)WHY 内存泄露是怎么产生的?

调用malloc分配内存之后,忘记调用相应的free函数释放它。从而导致废弃内存越来越多,从而可能导致程序或系统崩溃。

(一种解决的简单方法就是使用 alloca 函数来代替 malloc 分配内存,但由于alloca()的生命期只在所调用函数内部,所以当离开调用 alloca 的函数时,它所分配的内存会被自动释放。因此,这并不适用于那些比创建它们/的函数生命期更长的结构。另外可能还有一个可移植性的问题)

(3)HOW 如何检测内存泄露?

观察内存泄露是一个两步骤地过程。首先,使用 swap 命令观察还有多少可用的交换空间:

/usr/sbin/swap -s

total: 17228k bytes allocated + 5396K reserved = 22624K used, 29548K available

在一两分钟内键入该命令三到四次,看看可用的交换区是否在减少。还可以使用其他一些 /usr/bin/*stat 工具 如

netstat, vmstat 等。如果发现不断有内存被分配且从不释放,一个可能的解释就是有个进程出现了内存泄露。

(Redhat Linux 下实际使用:swap命令未发现,netstat命令产生的结果太过复杂,使用 vmstat 命令可以很方便的查出内存使用情况!)

第二个步骤就是确定可疑的进程,看看它是不是该为内存泄露负责。你可能已经知道哪个进程是罪魁祸首,不然可以使用“pa -lu 用户名”命令来显示所有进程的大小,如下所示:

F  S UID PID .....
................

标题为SZ的列就是以页面数表示的进程的大小(如果一定想知道以KB表示的页面的大小,可以使用 pagesize 命令)。同样数次重复这个命令,可以发现任何动态分配内存的进程的大小都在增长。如果一个进程看上去不断地增长而从不缩小,它就有可能出现了内存泄露。一个非常悲哀的现实是,管理动态内存是一项非常困难的编程任务。有些公共领域的X-Windows应用程序因内存泄露而臭名昭著,就像Apple Computer的董事会一样。

阅读更多
想对作者说点什么? 我来说一句

XPE初探.....

2009年05月04日 2.72MB 下载

iphone开发初探

2009年07月24日 24KB 下载

日本游戏制作理念初探_部分2

2016年08月18日 40.71MB 下载

cognos8.3 集群部署初探

2009年08月06日 385KB 下载

特征工程之小白初探

2017年11月14日 2.43MB 下载

vld1.0内存泄漏检测

2009年12月16日 773KB 下载

ModelMake初探

2010年04月15日 1.14MB 下载

没有更多推荐了,返回首页

不良信息举报

-内存泄露初探-

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭