如果我有一个持久对象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.引用
如果我有一个持久对象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.引用
他们,如果没有办法达到B和C(但他们到达其他对象),他们将照常收集。
B和C可以在请求后立即垃圾收集。没有什么指向他们。
是的,他们可以收集。如果A持有对他们的引用,那么只要A仍然可到达,他们就不会被收集。
是的,他们会的。只要垃圾收集可以从根目录到达的对象(基本上是当前活动调用中的局部变量,再加上全局变量)访问,垃圾收集就可以保持对象的活动状态。
如果A
不包含对B
和C
对象的引用,那么它不能使它们保持活动状态; A
被标记为由B
和C
这个事实是无关紧要的。
+1非常感谢您百分之百地正确地复述GC的工作情况。 – delnan
不,他们*可以*立即收集,这不是必要的。 – delnan
如果它们在请求范围内,则请求将引用它们。当它变得无法达到时,他们也是如此。请注意,海报说他们“存在的请求” – Gus
垃圾收集器没有立即清除内存,他们**可以收集,这并不意味着他们**将被收集在当时。 –