对于此代码片段:
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中的内存泄漏!
答案 0 :(得分:3)
在第一个示例中,v
仍然保留对100个对象的引用。
当v
超出范围时,它将成为垃圾收集的候选者,当它被收集时,也可以收集所有100个对象。
在第二个示例中 - 当您将v
设置为null时,它将成为垃圾收集的候选者,当收集它时,也可以收集所有100个对象。
所以,在这两种情况下都不应该有任何泄漏。
通常,没有必要将局部变量设置为null,当方法结束时,它将超出范围并且将受GC限制。
答案 1 :(得分:0)
对100对象的引用不会保留。 'o'显然在for循环的每次迭代中超出范围,只留下向量内部的引用(第一种情况下的o=null
是没有意义的)。当您将v
设置为其他内容(null)时,不再有对该向量的引用,因此它及其内容可以被垃圾回收。
这就是“引用计数”的含义;这是剩余的有效引用的数量。 你不能松开它们你可以在C中松开指针的方式。如果引用的范围消失了(例如,因为它是函数的本地),引用就消失了。 您不必将其设置为null。