-内存泄露初探-

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

(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的董事会一样。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章