2012-10-26 26 views
1

考慮:如何確定在給定程序中有資格進行垃圾回收的對象?

public class Trees { 
    Trees t; 

    public static void main(String[] args) { 
     Trees t = new Trees(); 
     Trees t2 = t.go(t); 
     t2 = null; 
     // more code here : LINE 11 
    } 

    Trees go(Trees t) { 
     Trees t1 = new Trees(); 
     Trees t2 = new Trees(); 
     t1.t = t2; 
     t2.t = t1; 
     t.t = t2; 
     return t1; 
    } 
} 

當達到11行,有多少個對象符合垃圾收集?

+2

多少你能辨認出? –

+0

什麼是't2.t'?請提供「樹」類的定義 – 2012-10-26 08:53:55

+1

我建議你購買和閱讀SCJP 6書。它從垃圾收集過程中有50頁,它非常詳細和有用。 –

回答

3

你問如何確定資格GC對象的數量。解決這些問題的最簡單方法是繪製一個顯示引用(您的示例中爲t,t1,t2)和實際對象本身的圖表。一旦對象沒有連接到任何引用,Java代碼就無法訪問它,因此它有資格收集。

此鏈接顯示了一個例子,如何畫圖表

http://radio.javaranch.com/corey/2004/03/25/1080237422000.html

2

創建三個對象:

Object "a": Trees t = new Trees(); 
Object "b": Trees t1 = new Trees(); 
Object "c": Trees t2 = new Trees(); 

在第11行,沒有人有資格進行垃圾回收,因爲變量t(在主宣)仍具有參考對象「A」,無一不可以從「a」到達「b」和「c」。

1

根據你的代碼片段,當控件到達你的「第11行」時,沒有任何對象可以被編輯爲GC

原因:

  • Trees t;是一個字段,並且因此不能夠GCed現在。
  • 在致電go後,t2將等於null。然而,在方法go中,每個t1t2指向另一個,再加上字段t指向其中的一個。所以沒有對象可以是GCed,因爲參考鏈:

t -> t2

t2 -> t1