我是否正确理解Java中的内存泄漏
对于此代码片段:我是否正确理解Java中的内存泄漏,java,garbage-collection,Java,Garbage Collection,对于此代码片段: Vector v = new Vector(10); for (int i = 1; i<100; i++) {Object o = new Object(); v.add(o); o = null; } 向量v=新向量(10); 对于(inti=1;i,在第一个示例中,v仍然保存对100个对象的引用。 当v超出范围时,它将成为垃圾收集的候选对象,当它被收集时,也可以收集所有100个对象。 在第二个示例中,当您将v设置为n
Vector v = new Vector(10);
for (int i = 1; i<100; i++)
{Object o = new Object();
v.add(o);
o = null;
}
向量v=新向量(10);
对于(inti=1;i,在第一个示例中,v
仍然保存对100个对象的引用。
当v
超出范围时,它将成为垃圾收集的候选对象,当它被收集时,也可以收集所有100个对象。
在第二个示例中,当您将v
设置为null时,它将成为垃圾收集的候选对象,当它被收集时,也可以收集所有100个对象。
所以,在这两种情况下都不应该有任何泄漏
一般来说,没有必要将局部变量设置为null,当方法结束时,它将超出范围,并受GC约束。在第一个示例中,v
仍然保留对100个对象的引用。
当v
超出范围时,它将成为垃圾收集的候选对象,当它被收集时,也可以收集所有100个对象。
在第二个示例中,当您将v
设置为null时,它将成为垃圾收集的候选对象,当它被收集时,也可以收集所有100个对象。
所以,在这两种情况下都不应该有任何泄漏
一般来说,没有必要将局部变量设置为null,当方法结束时,它将超出范围,并受GC约束。对100对象的引用不会保留。'o'显然在for循环的每次迭代中都超出范围,只留下向量内部的引用(在第一种情况下,o=null
是没有意义的)。当您将v
设置为其他值(null)时,不再引用向量,因此它及其内容可以被垃圾收集
这就是“引用计数”的意义所在;它是剩余有效引用的数量。您不能像在C中释放指针那样释放它们。如果引用的范围消失了(例如,因为它是函数的本地引用),引用已消失。您不必将其设置为null。对100对象的引用不会保留。'o'显然在for循环的每次迭代中都超出范围,只留下向量内部的引用(在第一种情况下,o=null
是无意义的)。当您将v
设置为其他值(null)时,将不再引用该向量,因此可以对其及其内容进行垃圾收集
这就是“引用计数”的意义所在;它是剩余有效引用的数量。您不能像在C中释放指针那样释放它们。如果引用的范围消失了(例如,因为它是函数的本地引用),引用已消失。您不必将其设置为null。您不应该将引用设置为null。GC比我们更聪明,它知道什么时候有资格进行清理。您不应该将引用设置为null。GC比我们更聪明,它知道什么时候有资格进行清理打扫干净了。
Vector v = new Vector(10);
for (int i = 1; i<100; i++)
{Object o = new Object();
v.add(o);
}
v= null;