2016-07-23 56 views
3
public class GarbageCollectionTest{ 

    public static void main(String...args){ 
     int [][]a = new int[4][3];//line 1 
     a[0] = new int[2];// line 2 
     a[2] = new int[3];// line 3 
     a = new int[3][2]; //line 4 
    } 
} 

我有點困惑,第3行之後有多少對象符合垃圾收集器的要求。我已經搜索瞭解決方案,但是我沒有對我找到的答案感到滿意。當我們創建一個數組數組時,有多少個對象符合垃圾回收器的條件?

+1

你的意思是執行第4行後? – SameeraB

+0

好吧,你重新分配兩個對象,所以我假設你有兩個對象(兩個數組)可用於垃圾收集。 – markspace

+1

你究竟想了解垃圾收集?一般來說,GC只是「做正確的事情」並清理不再涉及的對象。 – dimo414

回答

2

好吧,讓我們通過它去逐行:

創建新的int二維數組一個:

int [][]a = new int[4][3];//line 1 

您在更換兩個數組:

a[0] = new int[2];// line 2 
a[2] = new int[3];// line 3 

你重新分配並創建一個新陣列:

a = new int[3][2]; //line 4 

在第3行之後,您將拾取第2行& 3中替換的兩個陣列。

線4後,將垃圾收集器將拾取的每個對象(陣列),其被放置在「舊」一個,所以4個對象(int是一個目的,請參閱Konstantins回答here)。

4 + 2 +總

參考,以「老」一個本身= 7,我希望我這樣做是正確;)當你的程序不再有任何引用出現

1

垃圾收集到一個對象,而不是在創建對象時,所以「當我們創建一個數組數組」時,垃圾收集方面沒有任何反應。

基元的二維陣列,例如一個int[][],由一個對象體列保持引用到Ñint[]陣列(其中Ñ是外陣列的大小 - 4在你的例子的第1行) 。當您將該二維數組分配給a時,您將創建一個從a到外部數組的引用,並且依次轉到內部基本數組,因此垃圾回收器不會刪除這些對象中的任何一個。

在第二行,您構造一個新的int[],然後將其分配給外部數組的第一個索引。此分配(不是數組的創建)導致之前分配給索引0int[]變爲符合垃圾回收的條件,因爲不再有任何方法可以引用它 - 它是「垃圾」。

第三行是相同的,你構造一個新的int[]然後將它分配給一個索引,刪除對前面引用的數組的唯一引用。它現在也有資格收藏。因此,在第三行之後,可以收集兩個int[]對象。

線4種構建一個新的int[][],做同樣的工作如上面(一個對象體列保持Ñint[]陣列),然後分配該數組a,從而去除到以前的二維陣列的唯一引用。此時GC可以看到沒有任何參考舊數組並清除它。一旦發生這種情況,內部陣列也沒有剩餘的引用,GC也可以清除這些引用。

在第四行之後,您仍然可以通過a引用這個新數組,並且依次引用它包含的數組。您之前構建的陣列不再可達,因此最終將由GC進行清理。一旦GC有機會運行所有將留在內存中的數組,則會引用a引用的數組以及內部數組。

相關問題