2012-11-13 74 views
0

我不確定我是否完全理解垃圾回收器的行爲,因此我基於previous question提出了此問題。有資格進行垃圾回收的對象數量

在這個程序:

class A { 
    Boolean b; 
    A easyMethod(A a){ 
     return new A(); 
    } 
    public static void main(String [] args){ 
     A a1 = new A(); 
     A a2 = new A(); 
     A a3 = new A(); 
     a3 = a1.easyMethod(a2); 
     a1 = null; 
     // Some other code 
    } 
} 

多少對象將是符合垃圾收集?我認爲雖然a3永遠不會變爲空,但分配給它的第一個對象(new A())也應該被垃圾收集,因爲沒有引用仍指向它。我對嗎?因此,我認爲正確的答案將是2個對象。什麼是真的?

+3

不要將您的問題置於另一個問題上,這不是討論主題。在此發佈完整的相關代碼。 –

+1

編譯器可能會丟棄它發現的任何變量和賦值,它們在潛在的生命週期內將不會再次被讀取。因此,在代碼中分配給變量的對象在運行時不會自動引用或「可到達」,這意味着該對象可能有資格在其構造函數執行後立即進行收集。 – JimmyB

回答

2

我認爲雖然a3永遠不會成爲空,分配給它的第一個對象(new A())也應該是垃圾回收,因爲沒有引用仍然指向它。我對嗎?因此,我認爲正確的答案將是2個對象。

是的,這是完全正確的。 a3最初指向A的一個實例,但在此之後,變量被重新分配以指向不同的實例,因此不再有任何方式可以訪問原始實例,因此所述原始實例變爲符合垃圾回收的條件。

2

是的,你是對的。

a1 = <instance 1> 
a2 = <instance 2> 
a3 = <instance 3> 
a3 = <instance 4> //as a returned value 
a1 = null 

所以instance 1instance 3不再被引用,並且因此可以被收集。