内存泄露

一、概念

    1、 内存泄漏(memory leak)指由于疏忽或错误造成程序未能释放已经不能再使用的内存的情况。简言之:分配出去的内存无法回收。

    2、内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。

    3、 一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显式释放的内存。

        应用程序一般使用malloc,calloc,realloc等函数(C++中使用new操作符)从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说

这块内存泄漏了。

二、后果

   内存泄漏会因为减少可用内存的数量从而降低计算机的性能。最终,在最糟糕的情况下,过多的可用内存被分配掉导致全部或部分设备停止正常工作,或者应用程序崩溃。

三、JAVA中的内存泄露

我当时碰到这个问题时,很纳闷:JAVA不是自己管理内存吗,怎么也会有内存泄露的问题了?持有对无用对象的引用!!!

我们知道,java的垃圾回收机制实现的就是:对于没有被引用的对象是可以回收的。所以你要造成内存泄露就要做到:持有对无用对象的引用!这样垃圾回收机制无法回收这一片内存,就造成了内存泄露。

不要以为这个很轻易做到,既然无用,你怎么还会持有它的引用? 既然你还持有它,它怎么会是无用的呢?

举个例子:

假如堆栈加了10个元素,然后全部弹出来,虽然堆栈是空的,没有我们要的东西,但是这是个对象是无法回收的,这个才符合了内存泄露的两个条件:无用,无法回收。

参考:http://zhidao.baidu.com/question/314526455.html

四、oc中的内存泄露

例子:-(void) leakArray{

               NSArray *leakArray = [[NSMutableArray alloc]init];

               leakArray = nil;

          }这个方法就会造成内存泄露,泄露一个32B的NSArray。因为我们还没有释放他,他就变成无效引用了。但是在JAVA中,这样不会。

 

 

posted @ 2013-04-24 19:56  little_star  阅读(203)  评论(0编辑  收藏  举报