2012-05-23 30 views
-3

有一個在SCJP第三章... 看到下面的代碼...JAVA:要知道有多少對象資格GC

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.. 

    } 
} 

Q上的問題:如何有許多對象資格GC @行//做的東西

選項:

Option-1> 0 
Option-2> 1 
Option-3> 2 
Option-4> 3 
Option-5> 4 
Option-6> 5 

書上說:正確的ansert爲2:只有一個對象符合GC。

還是不能理解這個答案。只有一個對象可以符合GC的條件?

任何想法? Thanjan,Gunjan。 Thanx,Gunjan。

+2

您認爲應該有多少物體可以被清除?爲什麼? –

+2

FWIW,這是一個毫無意義的練習,因爲它需要一個與垃圾收集器實際工作方式無關的垃圾收集模型。 –

+0

@JonHarrop我不同意。它確實會教你關於懸掛引用,這將會搞亂任何GC,而與實際實現無關。而這種懸而未決的引用可能會導致Java中的內存泄漏,儘管這些通常會在實踐中涉及一些hashmap。 –

回答

-2

這裏... a1.b1或a2.b1是靜態的。所以它不能被GCed。但是a1有資格參加GC,因爲它沒有被使用。而a2.b1指向b1。所以b1不能被GCed。我們將b2歸零,因此它也可以添加到GC管道中。所以只有兩個對象a1和b2可以用於GC。

1

可能因爲a2.b1仍然會包含對b1的引用,因爲它是靜態的。它也有a1.b2引用b2。所以b1,b2和a2非常活躍。只有a1纔有資格進行垃圾回收。

+1

這裏... a1.b1或a2.b1是靜態的。所以它不能被GCed。但是a1有資格參加GC,因爲它沒有被使用。而a2.b1指向b1。所以b1不能被GCed。我們將b2歸零,因此它也可以添加到GC管道中。所以只有兩個對象a1和b2可以用於GC。 –

相關問題