2013-04-07 49 views
0

對於下面的代碼段:我是否理解正確的內存泄露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中的內存泄漏,提前致謝!

+2

您不應該將引用設置爲null。 GC比我們知道什麼時候有資格進行清理要聰明得多。 – duffymo 2013-04-07 12:26:49

回答

3

在第一個示例中,v仍保留對100個對象的引用。 當v超出範圍時,它將成爲垃圾收集的候選對象,收集所有100個對象時也是如此。
在第二個示例中 - 當您將v設置爲null時,它將成爲垃圾收集的候選對象,收集所有100個對象時也是如此。
因此,在這兩種情況下都不應該有任何泄漏。

通常,將局部變量設置爲null並不需要真正的需要,當方法結束時,它將超出範圍並且將成爲GC的主題。

0

對100個對象的引用不保留。 'o'顯然在for循環的每次迭代中超出範圍,只留下向量的內部引用(第一種情況下的o=null毫無意義)。當您將v設置爲其他內容(空)時,不再有對矢量的引用,因此可以對其進行垃圾回收。

這就是「引用計數」的意義;這是有效剩餘參考的數量。如果引用的範圍消失了(例如,因爲它是本地的函數),那麼引用就不存在了。 您不必將其設置爲空。