什么是內存泄漏

上一篇 / 下一篇  2007-10-23 15:07:52 / 个人分类:测试工具

什么是內存泄漏

所谓的内存泄漏可以理解为内存单元逐渐被无用的数据占用
在c c++里可以通过内存单元没有释放引起
java里可以通过 未对作废数据内存单元的引用置null引起
 
分配了内存而没有释放,逐渐耗尽内存资源,导致系统崩溃。
内存泄露是指程序中间动态分配了内存,但是在程序结束时没有释放这部分内存,从而造成那一部分内存不可用的情况,重起计算机可以解决,但是也有可能再次发生内存泄露,内存泄露和硬件没有关系,它是由软件设计缺陷引起的。
例如C语言编程中用到带有指针的运算,因为C指针是直导内存的,当运行完程序而没释放内存的话,那段内存就会泄露;同理会出现在C++中;所以malloc后一定要free,new了之后一定要delete,creatDC之后一定要deleteDC的。
 
内存泄漏可以分为4类:

1. 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。
2. 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。
3. 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次。
4. 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。
 
一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显示释放的内存。应用程序一般使用malloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。
 
个人理解:在编程过程中,如果我们在堆中动态审请了一块内存,在使用完这块内存后要及时把这块内存释放掉。如果没有及时释放,操作系统会认为这块内存仍然被使用,这就造成了内存泄露。这是程序开发人员必须要注意的问题。操作系统都有自己的内存管理和分配机制,如果内存管理策略不是很好就会引发内存碎片的存在。若不及时进行碎片整理,也将造成内存泄露。
 
听说,c/c++,java等语言存在内存泄露的隐患,C#语言机制好像就没有这方面的担忧,是这样嘛?
 
一个比较简单的判断内存泄漏的方法,看一下你的程序所占用的private bytes是多少,
如果一直增加,也就说明有内存泄漏。

performance monitor里面可以检测private bytes的变化情况。
 
 
 
 

TAG: 测试工具

 

评分:0

我来说两句

Open Toolbar