JAVA:了解有多少对象符合GC

JAVA:了解有多少对象符合GC,java,garbage-collection,Java,Garbage Collection,SCJP第三章中有一个问题。。。 请参阅以下代码 class Beta{ } class Alpha extends Beta{ static Beta b1; Beta b2; } class Tester{ public static void main(String a[]){ Beta b1 = new Beta(); Beta b2 = new Beta(); Alpha a1 = new Alpha()

SCJP第三章中有一个问题。。。 请参阅以下代码

class Beta{

}

class Alpha extends  Beta{
    static Beta b1;
    Beta b2;
}

class Tester{
    public static void main(String a[]){
        Beta b1 = new Beta();
        Beta b2 = new Beta();

        Alpha a1 = new Alpha();
        Alpha a2 = new Alpha();


        a1.b1 = b1;
        a1.b2 = b1;
        a2.b2 = b2;

        a1 = null;
        b1 = null;
        b2 = null;

        //DO STUFF
        //HOW MANY OBJECTS ARE ELIGIBE FOR GC AT THIS LINE..

    }
}
问:有多少对象符合GC@line//DO STUFF的条件

选项:

Option-1> 0
Option-2> 1
Option-3> 2
Option-4> 3
Option-5> 4
Option-6> 5
书中说:正确的ansert是2:只有一个对象符合GC条件。

仍然无法理解这个答案。如何只有一个对象符合GC条件

有什么想法吗??
Thanx,Gunjan.

可能是因为
a2.b1
仍然包含对
b1
的引用,因为它是静态的。它还有
a1.b2
引用
b2
。所以b1,b2和a2是非常活跃的。只有
a1
有资格进行垃圾收集。

此处……a1.b1或a2.b1是静态的。所以它不能被GCed。但是a1符合GC的条件,因为它没有被使用。a2.b1指向b1。所以b1不能被GCed。我们将b2置零,因此它也可以添加到GC管道中。因此,只有两个对象a1和b2符合GC条件。

您认为应该有多少个对象是可删除的?为什么呢?FWIW,这是一个毫无意义的练习,因为它需要一个垃圾收集模型,这个模型与垃圾收集器的实际工作方式没有任何相似之处。@JonHarrop我不同意。它确实教会了您关于悬空引用的知识,这将破坏任何GC,与实际实现无关。这种悬空引用可能会导致Java中的内存泄漏,尽管在实践中通常会涉及一些哈希映射。@Anony Mouse:你能给出一个悬空引用的例子,它会破坏任何GC吗?@JonHarrop,哪个GC将垃圾收集
Alpha.b1
?如果你想搞得一团糟,把它做成一个
静态HashMap
,然后把东西扔进去。这里,a1.b1或a2.b1是静态的。所以它不能被GCed。但是a1符合GC的条件,因为它没有被使用。a2.b1指向b1。所以b1不能被GCed。我们将b2置零,因此它也可以添加到GC管道中。因此,只有两个对象a1和b2符合GC的条件。