Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 组合对象的垃圾收集_Java_Garbage Collection - Fatal编程技术网

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[say
B
]的对象,在我结束使用它之后,我将它设置为
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可以收集并最终以任何顺序或根本不使用它们。