2012-06-04 129 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