2010-09-08 81 views
4
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); 
    System.out.println("c3 value : "+c3); 
    c1 = null; 
    System.out.println("c1 value : "+c1); 
    System.out.println("c2 value : "+c2); 
    // do Stuff 
    } 
} 

這是SCJP6模擬考試的一個例子。問題表明:當達到// doStuff時,有多少物件符合GC要求?答案是(2個對象),因爲:只有一個CardBoard對象(c1)符合條件,但它有一個也符合條件的關聯的Short包裝器對象 。哪些對象符合GC要求?

當我執行代碼時,它看起來像c3也指向null ...所以我會說3個對象符合GC的條件。

有人可以引導我通過這段代碼的邏輯。

回答

10

對象c3原本是空的,所以沒有回憶它的問題,因爲它從來沒有存在過。垃圾收集器的目的是清除堆中實際存在的對象。

其中,對c2的引用從不放棄,因此不會被回收。儘管看起來在陳述CardBoard c3 = c1.go(c2);中c2被取消,但事實並非如此。對c2的引用已通過值傳遞,儘管引用已無效,但在主方法中存在對該對象的現有引用。因此它不會被收回。

這給我們留下了c1,這已經明確無效,因此有資格收集。但是,c1還包含對Short變量故事的引用,該故事沒有任何其他對象的入站引用。這導致兩個對象有資格清除 - 一個CardBoard對象和嵌入的Short對象。

+1

或簡單地說:在該代碼中,只有兩個'new'關鍵字的情況,並且它們僅被執行一次在主要方法中,而不是在迭代中)因此,根據定義,這個代碼只能創建兩個對象,它怎麼能收集更多的數據呢? – 2010-09-08 11:37:44

+0

@Joeri,毫無疑問,你是對的,但要推斷出這個數字並不容易只有讀取代碼時纔有可能發生錯誤 – 2010-09-08 11:42:03

+0

當然,這是一個很好的指標,但是強引用更重要,我完全同意,只是在這種情況下,代碼非常簡單,你甚至不需要進一步觀察,但仍然是一個很好的練習 – 2010-09-08 11:58:33

1

c3從不指向任何對象,它總是一個空變量。因此,對象c3不適用於GC

0

在您的代碼中,c1中包含的c1和story(Short)僅適用於GC。即2個對象。

c3從不引用任何對象,因爲go()方法返回null。

c2不符合GC標準。在Java中,方法參數是按值傳遞的。而當go方法被調用的時候c2一直指向對象,儘管在go方法中傳遞變量被賦值爲null。

+0

不正確。 c2引用永遠不會被賦值爲'null'。 'go'方法是一個技巧,看看讀者是否理解Java不使用傳遞引用。 – 2010-09-08 10:59:40

+0

at'// doStuff','c2'仍然引用'CardBoard',因此**不符合gc的條件。 Vineet的回答說,這兩個對象是'c1'和'Short'。 – mikej 2010-09-08 11:00:29

+0

謝謝我已經更新了我的答案,其中包含我引用錯誤的信息:(。 – YoK 2010-09-08 11:06:46

2

CardBoard c1 = new CardBoard();

創建一個CardBoard實例及其Short實例。 (2個對象) 將CardBoard的引用分配給c1

CardBoard c2 = new CardBoard();

創建另一個CardBoard實例及其Short實例。 (另外2個對象) 將CardBoard的引用分配給c2

CardBoard c3 = c1。去(C2);

null分配給c3。 (go方法是一個竅門,看你是否理解Java參數傳遞語義,如果你認爲Java使用通過引用,你可能會錯誤地斷定c2被設置爲null這個調用實際上,c2沒有改變。 )

c1 = null;

null分配給c1。這使得第一個CardBoard實例及其Short實例無法訪問,並且成爲垃圾收集的候選對象。

第二個CardBoard實例及其Short實例仍可到達。