我是否在Java中正确理解内存泄漏

时间:2013-04-07 12:20:26

标签: java garbage-collection

对于此代码片段:

Vector v = new Vector(10);
  for (int i = 1; i<100; i++)
     {Object o = new Object();
      v.add(o);
      o = null;
     }

由于所有对100个对象的引用都设置为null,因此不会发生泄漏,因此它们将被GC收集。

然而,

 Vector v = new Vector(10);
  for (int i = 1; i<100; i++)
     {Object o = new Object();
      v.add(o);
      }
   v= null;

会出现泄漏,因为我只是对向量的引用为空,但是对100个对象的所有引用仍然存在,因此在它们对系统无用时不会进行GC收集。

请提前感谢,请帮助检查我是否正确理解Java中的内存泄漏!

2 个答案:

答案 0 :(得分:3)

在第一个示例中,v仍然保留对100个对象的引用。 当v超出范围时,它将成为垃圾收集的候选者,当它被收集时,也可以收集所有100个对象。
在第二个示例中 - 当您将v设置为null时,它将成为垃圾收集的候选者,当收集它时,也可以收集所有100个对象。
所以,在这两种情况下都不应该有任何泄漏。

通常,没有必要将局部变量设置为null,当方法结束时,它将超出范围并且将受GC限制。

答案 1 :(得分:0)

对100对象的引用不会保留。 'o'显然在for循环的每次迭代中超出范围,只留下向量内部的引用(第一种情况下的o=null是没有意义的)。当您将v设置为其他内容(null)时,不再有对该向量的引用,因此它及其内容可以被垃圾回收。

这就是“引用计数”的含义;这是剩余的有效引用的数量。 你不能松开它们你可以在C中松开指针的方式。如果引用的范围消失了(例如,因为它是函数的本地),引用就消失了。 您不必将其设置为null。