2012-06-04 173 views
2

如果我有一個持久對象A和大量包含對A的引用的臨時對象B,C,D等,那麼只要A引用了這些臨時對象,就會收集這些臨時對象什麼?Java垃圾回收混淆

class A {} // (sits in web app session) 

class B { 
    private A a; 
} 

class C { 
    private A a; 
} 

其中B和C的請求,只存在,但包含對A.引用

回答

2

他們,如果沒有辦法達到B和C(但他們到達其他對象),他們將照常收集。

4

B和C可以在請求後立即垃圾收集。沒有什麼指向他們。

+1

不,他們*可以*立即收集,這不是必要的。 – delnan

+0

如果它們在請求範圍內,則請求將引用它們。當它變得無法達到時,他們也是如此。請注意,海報說他們「存在的請求」 – Gus

+0

垃圾收集器沒有立即清除內存,他們**可以收集,這並不意味着他們**將被收集在當時。 –

2

是的,他們可以收集。如果A持有對他們的引用,那麼只要A仍然可到達,他們就不會被收集。

1

是的,他們會的。只要垃圾收集可以從根目錄到達的對象(基本上是當前活動調用中的局部變量,再加上全局變量)訪問,垃圾收集就可以保持對象的活動狀態。

如果A不包含對BC對象的引用,那麼它不能使它們保持活動狀態; A被標記爲BC這個事實是無關緊要的。

+1

+1非常感謝您百分之百地正確地複述GC的工作情況。 – delnan