2011-05-02 67 views
3

基本上,我對Java相當陌生,我試圖讓我的頭圍繞下面。當我離開範圍但仍然有參考時,Java GC發生了什麼?

public class Test { 

TestObject objectA; 

public static void main(String args[]) 
{ 
    Test t = new Test(); 
    t.test(); 
    while (true){ 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) {} 
     System.out.println("Obj A: " + t.objectA.toString()); 
    } 
} 

void test(){ 
    Object objectB = new TestObject(1, 1); 

    objectA = (TestObject)objectB; 
    System.out.println("Obj B: " + objectB); 

    objectB = null;  System.out.println("Obj B: " + objectB); 
} 

}

輸出:

Obj B: [email protected] 

Obj B: null 

Obj A: [email protected] 

Obj A: [email protected] 

基本上,我在方法測試創建本地對象對象B()和分配給它的參照可變對象A的測試對象的內部。

然後我將局部變量設置爲null並驗證引用已被清零。

現在從我的理解,我只是有效地消除了指向對象的指針。 objectA仍然存在,並且objectA保存唯一的引用。這是否意味着垃圾收集器不會收集在狹窄範圍的方法中創建的對象?

如果我沒有指向objectA的指針,我的對象是否會被收集?

對不起,如果這似乎是一個明顯的問題與答案我只需要確保我瞭解我已經閱讀。

回答

5

是的,使objectA指向該對象使其不被收集。是的,刪除剩餘的最後一個參考使對象有資格收集。

說「有資格收集」而不是「收集」很重要 - 對象可能不會立即收集,或者如果JVM再也不需要內存,甚至可能永遠不會收集對象。

+0

爲我清理乾杯。 – 2011-05-02 16:19:53

1

是的,你是對的一個對象有資格進行垃圾回收,如果沒有引用它。

例如:更確切地說,如果它不能被從參考在代碼訪問(3個對象引用對方,但代碼中的任何參考變量可以訪問它們中的一個的示例)

A - >乙

乙 - 「ç

ç - >甲

但A,B和C中沒有參考=>所有三個有資格GC。

相關問題