0

对于此代码片段:

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 中的内存泄漏,在此先感谢!

4

2 回答 2

3

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

一般情况下,没有必要将局部变量设置为null,当方法结束时,它会超出范围,会被GC。

于 2013-04-07T12:25:55.633 回答
0

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

这就是“引用计数”的意义所在;它是剩余的有效引用数。 您不能像在 C 中释放指针那样释放它们。如果引用的范围消失了(例如,因为它是函数的本地对象),那么引用就消失了。 您不必将其设置为 null。

于 2013-04-07T12:27:01.003 回答