2012-03-17 18 views
2
public class A{ 
    A a; 

    public static void main(String args[]){ 
     A b = new A();//new object created, obj1 
     b.a = new A();//new object created, obj2 
     b = null; 
     //line 8 
    } 
} 

當到達第8行時,obj1符合GC的條件。 obj2是否也符合GC的資格?Java垃圾回收,對null的設置參考

回答

3

如果您想確定垃圾收集對象的資格,請嘗試查看它是否可以從根集訪問。根集是類似於調用堆棧和全局變量引用的對象的東西。

在你的例子中,如果obj1args(讓我們忽略其他可能存在的 - 它們對你的例子無關緊要),那麼最初的根集合就包括在內。就在行6之前,obj2顯然可以從根集獲得,因爲obj1包含對obj2的引用。但是在第7行之後,根集中唯一的對象是argsobj1obj2args引用,因此在第8行,obj1obj2都不適用於收集。

+1

+1(從根部) – 2012-03-17 05:07:12

5

您創建至obj2的唯一參考範圍是obj1b.a = new A();)。只要你失去了對obj1b = null;)的引用,你也失去了對obj2的引用,所以是的,它符合GC的條件。

1

是,這裏是展示在行動GC的例子:

static int c = 2; 
public static void main(String args[]) throws Exception { 
    class A{ 
     A a; 
    } 
    A b = new A(){ 
     public void finalize(){ 
      System.out.println("obj 1 has been GC'd"); 
      c--; 
     } 
    }; 
    b.a = new A(){ 
     public void finalize(){ 
      System.out.println("obj 2 has been GC'd"); 
      c--; 
     } 
    }; 
    b = null;   
    while(c>0) { 
     System.gc(); 
     Thread.sleep(42); 
    } 
} 

輸出:

obj 1 has been GC'd 
obj 2 has been GC'd 
0
b = null; 

是沒用的,因爲一條線後,你已經達到了B的範圍到底。這兩個對象在離開它們定義的範圍之後都不可訪問,因爲它們的引用沒有放在其他地方,通過方法調用或作爲構造函數調用中的參數,或者作爲其他地方發佈的其他地方的反向引用。