2013-12-19 55 views
0

這個問題來自SCJP。我們需要找到有資格進行垃圾收集的對象。答案是c3和短篇小說。我需要知道,爲什麼它的短篇故事符合GC的要求。這實際上是一個實例變量。這是否意味着,如果我不使用我的實例變量他們有資格進行垃圾收集?爲什麼包裝器對象有資格進行垃圾回收?

實際答案,因爲每本書是:只有一個紙板對象(C1)是合格的,但它有一個相關的短包裝對象,也是合格的。所以「兩個」對象是合格的。

class CardBoard { 
    Short story = 200; 
    CardBoard go(CardBoard cb) { 
     cb = null; 
     return cb; 
    } 
    public static void main(String[] args) { 
     CardBoard c1 = new CardBoard(); 
     CardBoard c2 = new CardBoard(); 
     CardBoard c3 = c1.go(c2); 
     c1 = null; 
     // do Stuff 
    } 
} 
+0

什麼你所期望的,一旦封閉'CardBoard'實例GCed發生到'Short'實例? – arshajii

+0

Yaa多數民衆贊成在我正在考慮如果C1是垃圾,會發生什麼短? – user2985842

回答

0

答案不說c3它說c1因此它包含Short story。這是由於線路

c1 = null; 

此時將其通過引用c1可以GCed對象並因而它是指任何對象。

+2

@ElliottFrisch:c3從來沒有任何東西,但空。 – falstro

+0

@ElliottFrisch但是沒有哪個對象變得沒有引用。垃圾收集發生在實例上,而不是變量(不再包含它們)。 – chrylis

+0

@roe很好,你說得對。它從未實例化過。 –

1

如果什麼都沒有引用c1那麼Short story = 200;字段(屬於c1實例)也有資格收集。

3

這一切都歸結爲垃圾回收認爲「可達」。基本上,它從所謂的垃圾收集根開始(執行線程中的局部變量就是這種根的一個例子),並且遵循對其他對象的所有引用。通過遍歷所有這些引用訪問了所有可以到達的對象之後,還有一些不再可到達的對象,這意味着無論您嘗試多麼困難,都不會再次使用這些對象,因此可以安全地將它們丟棄(或收集爲垃圾)。

雖然c1引用其story對象,但無法找到任何一個,因此它們都符合條件。

c3從來沒有引用一個對象時,例如是爲了混淆,但go()總是返回空引用,並沒有對象實例以往任何時候都c3創建的,它也不會掛在由c1c2引用的任一對象(雖然後者與這種情況無關,因爲它仍然被c2變量引用)。

+0

但爲什麼它說「相關的短包裝對象,也有資格」?那是什麼意思? – user2985842

+0

@ user2985842;不需要大喊。這意味着由變量'c1'引用的對象反過來引用了一個'Short'類型的對象(稱爲包裝對象,因爲它只是包裝一個原始值,沒有其他目的而不允許它用作對象) ,儘管它被引用,但它不再可訪問,因此有資格進行垃圾收集。如果是「關聯」的部分讓你絆倒,你需要再看看對象和類,每個CardBoard對象實例都有(通過類定義)通過'story'字段引用一個Short對象。 。 – falstro

+0

對不起4r喊...我不是那個意思...我得到了答案...謝謝 – user2985842