Java 组合对象的垃圾收集
我有两节课Java 组合对象的垃圾收集,java,garbage-collection,Java,Garbage Collection,我有两节课 Class A { //constructor } Class B { private A a; public B() { a = new A(); } } 假设我在我的代码中使用了一个B[sayB]的对象,在我结束使用它之后,我将它设置为null。我知道B的对象现在可用于垃圾收集 我知道在将b设置为null之后,它将立即符合垃圾收集的条件?但是A型的对象呢?在我将B设置为null后,它是否立即可用于垃圾收集?或者在B被垃
Class A
{
//constructor
}
Class B
{
private A a;
public B()
{
a = new A();
}
}
假设我在我的代码中使用了一个B[sayB
]的对象,在我结束使用它之后,我将它设置为null
。我知道B的对象现在可用于垃圾收集
我知道在将b设置为null之后,它将立即符合垃圾收集的条件?但是A型的对象呢?在我将B设置为null
后,它是否立即可用于垃圾收集?或者在B被垃圾收集后,它是否符合垃圾收集的条件
理论上,直到B被垃圾回收,a仍然有一个对它的引用?因此,SUN JVM编译器在设置
b=null
后会立即检测到这一点吗 一旦没有对b的硬引用,就无法访问其对a的引用,因此据我所知,两者都有资格进行垃圾收集。GC足够聪明,可以跟踪对象图中的路径,以检查对某个对象的现有引用是否可访问。它甚至可以检测周期(比如,在您的情况下,如果b
引用了a
,而a
引用了b
,一般来说,您不应该在意。它是不可访问的,您应该让垃圾收集来担心其余的事情。因为它变得不可访问,所以应该可以立即进行垃圾收集。有also运行Java程序(至少在Sun JVM中)时可以使用一些标志,这些标志将提供有关垃圾收集过程中发生的情况的调试信息。请尝试-verbose:gc选项
一旦将ObjectB设置为null(*条件为ObjectA未被任何其他活动对象引用),对象A也将成为合格的垃圾收集。 这种情况被称为“隔离岛”
这是对这种情况的一个很好的解释。(是SCJP书中的另一个解释)如果我有一个问题,我怀疑可能是由于这个原因造成的呢?:-)@user587465这可以说是一个很好的理由,因为你不能指望GC在程序执行期间一直在运行。也就是说,你的程序可以在没有运行一个收集周期的情况下完成。因此,除非你处理的是弱引用、软引用或虚引用或终结器,否则问题的原因不太可能与但是,如果您能描述问题,也许我们可以提供更多的想法,从何处寻找根本原因。如果您的
A
实例以某种方式逃逸b
,则它可能继续存在。它们都有资格同时被收集,因为它们都无法同时被访问。GC可以收集并最终以任何顺序或根本不使用它们。