论坛首页 Java企业应用论坛

java的内存泄露问题

浏览 8732 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-09-26  
今天在读java的ArrayList 的源码的时候对该方法里面的动作

 public E remove(int index) {
 RangeCheck(index);

 modCount++;
 E oldValue = elementData[index];

 int numMoved = size - index - 1;
 if (numMoved > 0)
     System.arraycopy(elementData, index+1, elementData, index,
        numMoved);
 elementData[--size] = null; // Let gc do its work

 return oldValue;
    }

 elementData[--size] = null; // Let gc do its work 百思不得其解,不明白为什么要做这样一个动作,有什么意义。无意见拿起手边的effective java这本书 ,原来这句代码是消除过期的对象的引用!!防止发生outofmemoryerror ,把这章看完,感觉仍然很模糊,为什么垃圾回收器不回收这些引用?什么时候一个类自己管理自己的内存?或者什么叫做一个类自己管理自己的内存?看书上的解释,似乎有数组的情况下,有可能发生这样的事情,那么有没有其他的存在情况呢?

还有就是作者所说的缓存也有可能存在这种情况,也很是茫然。

   发表时间:2007-09-26  
java中所谓管理自己的内存,就是在对象中维护一些引用,即使外界暂时不再使用这些引用,GC也不会释放他们(因为还在被管理对象引用着)。当外界完全不再使用某引用时,管理对象应该及时的清除这个引用,否则就会造成内存泄露。

形象点说,你可以把引用当作钩子,管理对象当作架子,被管理的对象当作鸭子,GC就是在地上跑来跑去拣掉下来鸭子的狗。
鸭子通过钩子挂在架子上,我们需要的时候随时都能从架子上找到所需要的鸭子,即便我们暂时不用,鸭子也不会被狗叼走。可是如果一只鸭子臭了,我们以后永远用不着了,那么我们就会断开钩子,鸭子就会掉在地上被狗拣跑了。

也就是说,只要你自己管理了一个对象的引用,GC就不会帮你去释放,只有释放了引用,GC才会释放引用指向的对象。
0 请登录后投票
   发表时间:2007-09-26  
timerri 写道
java中所谓管理自己的内存,就是在对象中维护一些引用,即使外界暂时不再使用这些引用,GC也不会释放他们(因为还在被管理对象引用着)。当外界完全不再使用某引用时,管理对象应该及时的清除这个引用,否则就会造成内存泄露。

形象点说,你可以把引用当作钩子,管理对象当作架子,被管理的对象当作鸭子,GC就是在地上跑来跑去拣掉下来鸭子的狗。
鸭子通过钩子挂在架子上,我们需要的时候随时都能从架子上找到所需要的鸭子,即便我们暂时不用,鸭子也不会被狗叼走。可是如果一只鸭子臭了,我们以后永远用不着了,那么我们就会断开钩子,鸭子就会掉在地上被狗拣跑了。

也就是说,只要你自己管理了一个对象的引用,GC就不会帮你去释放,只有释放了引用,GC才会释放引用指向的对象。
解释的很明白
0 请登录后投票
   发表时间:2007-09-26  
timerri 写道


形象点说,你可以把引用当作钩子,管理对象当作架子,被管理的对象当作鸭子,GC就是在地上跑来跑去拣掉下来鸭子的狗。
鸭子通过钩子挂在架子上,我们需要的时候随时都能从架子上找到所需要的鸭子,即便我们暂时不用,鸭子也不会被狗叼走。可是如果一只鸭子臭了,我们以后永远用不着了,那么我们就会断开钩子,鸭子就会掉在地上被狗拣跑了。



这个比喻简直太拽了, 是原创??? 最佳创意奖!!!
0 请登录后投票
   发表时间:2007-09-26  
二楼的比喻很形象~~~
0 请登录后投票
   发表时间:2007-09-27  
呵呵,谢谢。但是我有个疑问jvm是怎么知道什么时候这些引用是我们自己在管理的?
0 请登录后投票
   发表时间:2007-09-27  
或者说我们什么时候去消除对象的过期引用?
0 请登录后投票
   发表时间:2007-09-27  
回到最早的COM,你就会看到引用计数器,这个东西,有人用就+1,有人释放就-1,数值到0就从内存中清除掉。这是垃圾收集最直接的方法---引用计数算法。

引用计数无法解决环形数据的问题,所以还得引入追踪算法。 其他的算法还有不少。
0 请登录后投票
   发表时间:2007-09-27  
peacockbird 写道
呵呵,谢谢。但是我有个疑问jvm是怎么知道什么时候这些引用是我们自己在管理的?


jvm不知道,所有没法掉下来的鸭子他都不管。
所以,如果,鸭子你自己死命的拽着,越拽越多,那条叫GC的狗永远刁不到。

钩子一般有两种情况会断开
1,函数内局部变量,出函数会断开
2,手工设置null
0 请登录后投票
   发表时间:2007-09-27  
sum的JVM的GC,引用计数、mark and sweep、分代收集算法都用到了,对GC有兴趣可以去看《深入java虚拟机》第二版啊
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics