[英]Am I understanding Memory Leakage correctly in Java
对于此代码片段:
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中的内存泄漏,在此先感谢您!
在第一个示例中, v
仍然保留对100个对象的引用。 当v
超出范围时,它将是垃圾回收的候选对象,当v
被回收时,所有100个对象也可以被回收。
在第二个示例中-将v
设置为null时,它将是垃圾收集的候选对象,当收集到它时,也可以收集所有100个对象。
因此,在两种情况下都不应有任何泄漏。
通常,没有真正的必要将局部变量设置为null,方法结束时,它将超出范围并受GC约束。
对100对象的引用不会保留 。 'o'显然在for循环的每次迭代时都超出范围,仅在向量内部保留引用(在第一种情况下, o=null
是毫无意义的)。 将v
设置为其他值(空)时,将不再引用该向量,因此可以对其进行垃圾回收。
这就是“引用计数”的含义; 这是剩余的有效引用数。 您无法像使用C中的指针那样松开它们 。如果引用的范围已消失(例如,因为它在函数中是局部的),则引用已消失。 您不必将其设置为null。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.