JAVA:了解有多少对象符合GC
SCJP第三章中有一个问题。。。 请参阅以下代码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()
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的条件。