黑马程序员技术交流社区

标题: 内存泄露时什么原因? [打印本页]

作者: 14年7月想去it    时间: 2014-10-7 17:24
标题: 内存泄露时什么原因?
Vector v = new Vector(5);   
for (int i = 1; i < 50; i++)   {   
         Object o = new Object();    
        v.add(o);    
        o = null;   
}

是不是对象o已经被置为null,它在内存中已经不存在,为什么还会造成内存泄露?



作者: 水竹    时间: 2014-10-7 17:24
本帖最后由 水竹 于 2014-10-7 21:19 编辑

“是不是对象o已经被置为null,它在内存中已经不存在,为什么还会造成内存泄露?”

这个不是的,一个对象只有在没有引用指向它的时候才可以被回收,而且这个回收的时间也不是固定的,什么时候回收必须要看垃圾回收器。

而且在你这个例子中,也并非是将o设置为null就可以的,因为在o被设置为null之前,实际上是存在着两个指向该对象的引用,一个是o,另一个存在于v里面,你只是将o设置为null,并没有达到让其能够回收的程度。

对于v里面有指向那个对象的引用应该不难理解吧?因为如果引用不存在的话,那v要怎么对这个对象进行操作呢?

如果还是不理解的话我可以举一个例子:
  1. class Demo{
  2. public static void main(String[] args){
  3. Object o = new Object();
  4. function(o);
  5. o=null;
  6. }
  7. public static void function(Object o1){
  8. System.out.println(o1);
  9. }
  10. }
复制代码

在上面的代码中,当main方法调用function方法的时候,就是将对象的引用传递了过去,所以在调用之后,实际上o1和o都含有该对象的引用,只不过调用方法的时候方法执行完毕就释放了空间,o1就不存在了,而Vector却是一直都持有该对象的引用的。
作者: dsh    时间: 2014-10-10 22:40
水竹 发表于 2014-10-7 21:16
“是不是对象o已经被置为null,它在内存中已经不存在,为什么还会造成内存泄露?”

这个不是的,一个对象 ...

想问问 你的这个代码图是怎么弄上去的  我每次都是复制   好麻烦
作者: 水竹    时间: 2014-10-10 22:53
dsh 发表于 2014-10-10 22:40
想问问 你的这个代码图是怎么弄上去的  我每次都是复制   好麻烦

那不是图,都是字,看到回复框上面有排按钮了么,就是字体加粗那一栏,倒数第二个“<>”,这个就是放代码的地方,点它然后把代码粘进去,你试试就知道了。
作者: dsh    时间: 2014-10-10 22:58
水竹 发表于 2014-10-10 22:53
那不是图,都是字,看到回复框上面有排按钮了么,就是字体加粗那一栏,倒数第二个“”,这个就是放代码的 ...

知道了  谢谢啊   解除了我好久的疑惑
作者: 刘家斌    时间: 2014-10-11 22:36
受教了,我也不会弄代码
作者: AlanHand    时间: 2014-10-14 13:43
一楼已经解释的很好啦
作者: rel4x    时间: 2014-10-15 01:33
受教了。。。

作者: 林兴才    时间: 2014-10-15 15:11
受教了!!!
作者: Eric1225    时间: 2014-10-15 23:05
针对楼主的问题,如果仅仅释放引用本身,那么Vector仍然引用该对象,所以这个对象对GC来说是不可回收的,因此,如果对象加入到Vectorhou ,还必须从Vector中删除,最简单的方法就是将Vector对象设置为null。希望对楼主有所帮助!:)
作者: axing110    时间: 2014-10-19 19:27
java有自动内存回收机制,如果你不用了的对象,系统会自动回收,而不像C语言等。
简单的说,如果C语言中你null也需要在free的,而在Java中你只是把他的指向设置成了空,
而不是释放了内存空间,就像链表一样,你删除了节点,还必须释放空间,而在Java中这个动作时自动的

作者: 3-_-3    时间: 2014-10-19 19:40
Java应该不会内存泄露吧
作者: 皮三藏    时间: 2014-10-23 16:13
o=null只是意味着o这个引用指向null,而真正创建的Object对象还被v所引用,由于Object还被引用,所以GC在回收内存的时候不会回收掉,如果Object对象对程序已经没有任何作用,那么我们就认为这个程序发生了内存泄露
作者: cctao    时间: 2014-10-27 09:49
Object o = new Object();//新创建一个object 对象,并且让o 指向它,此时新对象A的引用计数器为1
v.add(o);//这句过后 上面的对象A引用计数器为2
o=null;//取消o对对象A的引用,对象A的引用计数器为1,只有引用计数器的值为0,才不会造成内存泄露,这是我用IOS的思想解释的希望能帮到你

作者: 天空总是很蓝    时间: 2014-11-19 03:05
我也遇到这个问题了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2