[英]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.