2012-09-02 130 views
2

這個問題就像是我以前one 考慮:垃圾收集問題

3. interface Animal { void makeNoise(); } 
4. class Horse implements Animal { 
5. Long weight = 1200L; 
6. public void makeNoise() { System.out.println("whinny"); } 
7. } 
8. public class Icelandic extends Horse { 
9. public void makeNoise() { System.out.println("vinny"); } 
10. public static void main(String[] args) { 
11. Icelandic i1 = new Icelandic(); 
12. Icelandic i2 = new Icelandic(); 
13. Icelandic i3 = new Icelandic(); 
14. i3 = i1; i1 = i2; i2 = null; i3 = i1; 
15. } 
16. } 

當達到14行,有多少個對象符合垃圾收集器?

A. 0

B. 1

C. 2

D. 3

E. 4

F. 6

我選擇了A,但正確的答案是E,但我不知道爲什麼?

+3

哪裏是線14? – vainolo

+0

我不明白它是如何成爲'E'的,因爲你只創建三個對象實例(忽略可能在'Icelandic'構造函數內創建的任何對象)。除非他們說'args'也是垃圾收集的候選人,理由是main()'將返回並終止程序。 – aroth

+0

@vainolo它在通知了'weight'字段和 – peeyush

回答

8

我們將在main中創建的三個Icelandic對象稱爲A,BC

Initialy

  • i1=Ai2=Bi3=C;

i3 = i1

  • i1=Ai2=Bi3=A;

i1 = i2

  • i1=Bi2=Bi3=A;

i2 = null

  • i1=Bi2=nulli3=A;

i3 = i1

  • i1=Bi2=nulli3=B

在管線14中,站立的引用僅BIcelandic類型的對象。正在運行的程序中丟失了AC

被丟失每個Icelandic對象使垃圾收集器的兩個對象收集,即。所述Icelandic對象本身和每IcelandicLong對象,這使垃圾收集的對象的總數。

由於makeNoise方法從來沒有所謂的,他們不改變結果。

+0

如果makeNoise()方法**是**叫? –

+2

@Tomasz Nurkiewicz:它取決於'System.out.println'的實現。 –

+0

我認爲我錯過了一條規則,我認爲當這個任務執行i1 = i2時,i1會引用A和B,但這似乎是錯誤的,這是真的,當那個屁股。執行i1不會再指A,只指B? –

2

如果仔細一看,畢竟i1i3的指配完畢後指向第二個對象,而i2指向null。這意味着兩個Icelandic對象有資格使用GC。

每個Icelandic對象包含一個Long它使4個對象總共符合GC的條件。有趣的是,如果常數爲12L,則答案將爲:由於Long內部常量緩存導致的2。還請注意"whinny""vinny"來自常量池,不會被垃圾收集。

一旦您離開聲明所有i1i2i3的範圍,其餘兩個對象也符合GC要求。