2016-03-18 64 views
1

顯然,根據我正在閱讀的書,這裏的答案是2,但我仍然不明白爲什麼。它說,在行「//做東西」之後,2個對象將符合GC的條件。此Java代碼中有多少對象符合垃圾收集條件?

有人能請一步一步解釋一下嗎?在代碼中的某一行之後,知道有多少對象符合垃圾回收的條件,這有沒有什麼好玩的技巧?因爲我們被告知這些問題(有多少可用於gc)將出現在測試中。

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 
    } 
} 

,是的,答案是「2的對象將是eligble進行垃圾回收後再行‘//做的東西’」,但我還是不明白爲什麼。


在此圖像中,它也說,爲什麼答案是2,但該解釋只是做了很多更加混亂我。

Image from the SCJP book we're told to read.

,它甚至沒有解釋發生了什麼其他的對象。


編輯:

那麼根據你們,這是C1和C3有資格GC,我可以看到爲什麼,因爲C1已經被設置爲空,C1.GO(C2)返回null到C3。

但是根據這本書,它只有C1是合格的,答案是2,因爲短包裝。我不知道這是爲什麼,甚至什麼是短包裝對象。

+2

在現實中,'後//做stuff'所有對象符合GC的條件。 – biziclop

回答

0

c2仍然引用紙板對象。當我們調用c1.go(c2)時,c1被設置爲null,c3引用null。 因此,它們都是(c1和c3)不再在內存中引用,並有資格進行垃圾回收。

+0

但c3應設置爲空,因爲c1.go(c2)返回null,對嗎? – Sherekan

+0

對不起,你是正確的我誤了標籤。 – Miles

1

我已經運行並調試了代碼,我可以看到c1和c3爲空(顯而易見的原因),而且它是c2的!= null。

這是因爲Java中的對象按值傳遞(explanation)並且在方法內設置c2 = null不會導致原始c2設置爲null。

+0

這就是我想要的類型..:) c2沒有設置爲null,go()的'cb'參數設置爲空 – Rafcik

+0

但是爲什麼只有c1是null加上短包裝?我仍然很困惑。 –

+0

c1爲空,因爲最後null指定給c1; c3爲空,因爲c1.go(c2)將null返回給c3; c2不爲空,因爲對它的對象的c2引用被傳遞給了go()函數中的參數cb,但是c2沒有被分配給null本身,而是僅在go()函數中分配了cb; – Rafcik

0

我認爲正確的答案實際上只有一個對象將符合垃圾收集後行「//做東西」。

在該代碼中,只創建了2個對象,然後c1和c2引用它們。行「c1 = null;」之後一個對象立即變爲符合GC的條件,儘管第二個對象仍然可以通過c2 ref訪問。

更新:

我錯過了一個細節 - 每次通話new CardBoard()創建兩個對象,所以叫c1 = null,使符合條件的紙板和他的嵌套短成員GC

+0

我同意你的看法,我錯過了只有兩個CardBoard對象被實例化,c3 = c1.go(c2)沒有實例化任何新的對象。所以在這種情況下,當達到// dostuff時c1 == null,所以它可以被垃圾回收(這是一個對象),這意味着c1中的短故事= 200將可以用於垃圾回收(這是第二個對象)。 – Sherekan

+0

其實我也是錯的。正確的解釋在這裏http://stackoverflow.com/questions/11564137/objects-eligible-for-garbage-collection?rq=1 – Alexey

+0

@Alexey哇我不知道這個紙板問題已經被問到。抱歉。如果已經詢問完整的代碼,我不知道該如何檢查。 –