Java垃圾收集混乱

Java垃圾收集混乱,java,garbage-collection,Java,Garbage Collection,如果我有一个持久的对象a和许多临时对象B、C、D等,其中包含对a的引用,那么只要a被某个对象引用,这些临时对象还会被收集吗 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和许多临时对象B、C、D等,其中包含对a的引用,那么只要a被某个对象引用,这些临时对象还会被收集吗

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
对象引用的事实是不相关的。

不,可以立即收集它们,这不是必须的。如果它们在请求范围内,请求将引用它们。当它变得遥不可及时,他们也会这样做。请注意,海报上说它们“为请求而存在”垃圾收集器不会立即清除内存,它们可以被收集,但这并不意味着它们将在那时被收集。没有任何东西说GC必须在每次请求之后运行,或者更糟糕的是,每次对象可能变得不可访问时都必须运行(如果需要的话,效率会非常低)。我不认为我说过其他的话吗?你对错误的答案发表评论了吗?+1非常感谢你看到GC 100%正确复述的罕见喜悦。