2013-01-12 29 views
2

晚上好,請你看看,以證明有資格爲GC對象的數目此代碼示例:我看到有四個對象時做這符合GC計數這是符合GC

public class CardBoard { 

Short story = 5; 

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 

    } 
} 

東西是c3,它是關聯的故事對象和c1以及它相關的故事對象,你看到了什麼?

+0

...我們在接受採訪嗎? :-) – radai

+0

確切的複製:http://stackoverflow.com/questions/13109717/java-garbage-collection-and-null-reference – MrKiller21

回答

8

確切地說有有資格獲得GC的對象 - 之前引用的對象爲c1c3指向nullCardBoard.go()總是返回null)。

還記得c1c2變量只是引用,而不是對象。因此他們不需要被垃圾收集。他們活在堆棧中,而不是堆在一起。

CardBoard go(CardBoard cb) { 
    cb = null; 
    return cb; 
} 

這隻勾銷cb參考(參數),不c2參考:

最後不要上當。


Short story = 5; 

是一個單獨的疑難雜症。如果它是short story那麼它不會被視爲一個單獨的對象。但是Short是一個對象,因此技術上CardBoard指向另一個符合GC要求的對象。然而!由於原始包裝緩存5實際上是Short靜態緩存的一部分,並且從未真正適用於GC。換句話說,類型Short代表5的對象始終在Short中由static緩存引用。

這裏是最好的部分。如果它是:

Short story = 5000; 

那麼答案是...... 。這是因爲Short.valueOf((short)5000)總是返回Short的新實例(適用於GC),而Short.valueOf(5)總是返回相同的一個實例。

哇,這很棘手!

+1

完全忘記了那個緩存。向你致敬。 – radai

+0

當你說「 - 之前由c1引用的那個」時,這是什麼意思? – Imposter

+1

@Imposter:在第一行看到:'c1 = new CardBoard()',最後'c1 = null'。新的CardBoard()是符合GC要求的。 –