浅谈内存泄露

 

fyf师兄总结的,写得不错,转载一下,顺便给他的blog做做广告

http://blog.sina.com.cn/icemangary

 

附网上牛人写的一个内存泄露检查工具,对malloc,free进行封装以跟踪内存分配情况,详细的内容见附件中的文档。

 

文件: C内存泄露检测工具.rar
大小: 21KB
下载: 下载

 

(1)被分配的内存总是经过对齐,以适合机器上最大尺寸的原子访问,一个malloc请求申请的内存大小为方便起见一般圆整为2的乘方。回收的内存可重新使用,但没有(方便的)办法把它从你的进程移出交给操作系统。

 

(2)有些程序并不需要管理他们的动态内存使用,当需要时,他们简单地通过分 配来获得,从来不用担心释放它,这类程序包括编译器和其他一些运行一段固定的(或有限的)时间然后终止的程序。程序终止时,所有内存会被自动回收,但是建议还是释放吧,不要钻编译器的空子,万一你不小心搞出个死循环来呢。其他如服务器程序、操作系统本身经常需要数日乃至数周的连续运行 ,这个时候千万要管理好动态内存的分配和回收,因为C语言不使用垃圾收集器(自动确认并回收不再使用的内存块),否则进程就会一般分配越来越多的内存,一边却不释放不再使用的那部分内存。

 

(3)在可能的情况下可以使用alloca()来分配动态内存,这样可以避免内存泄露的问题,因为你不需要显示释放它,它是在栈上分配的,可以自动被释放,而且开销也很小。但要注意的是,使用这个函数会降低程序的可移植性,如果处理在硬件上不支持堆栈,alloca()就很难高效地实现。

 

(4)内存泄露的主要症状是罪魁进程速度会减慢,原因是体积大的进程更有可能被系统换出,让别的进程运行,而且大的进程在换进换出时所花费的时间也更多。需要注意的一点是,泄漏的内存往往比忘记释放的数据结构要多,因为malloc所分配的内存通常会圆整为大于申请数量的2的整数次方, 如申请212B,实际上会圆整分配256B

 

(5)如何检测内存泄漏的两步骤:一、swap -s命令,一两分钟内键入该命令三到四次,看看交换区是否在减少。还可以使用其他命令如netstatvmstat等;二、确定可疑进程,看看他是不是该为内存泄漏负责,使用“ps -lu 用户名,命令来显示所有进程的大小,同样重复该命令 ,可以发现任何动态分配内存的进程的大小都在增长,如果一个进程看上去不断地增长而从不缩小,它就可能出现了内存泄露。

 

(6)进行内核程序开发的时候,一定要记得及时释放动态分配的内存,如果引起内核的内存泄漏,机器的速度会变慢下来,有时机器会挂起或不知所措,当内核请求内存时,他们通常会进行等待,知道有足够的内存分配为止,内存泄漏会导致每个需要分配内存的内核程序都无限期等待,最终挂起。

 

(7)需要注意的是,系统并不支持在信号处理程序内部调用库函数(除非严格符合标准所限制的条件)。

posted @ 2013-04-19 14:05  ydzhang  阅读(176)  评论(0编辑  收藏  举报