2012-08-29 38 views
4

考慮這個示例代碼:當一個對象符合垃圾收集器的條件嗎?

1. public class GC { 
2.  private Object o; 
3.  private void doSomethingElse(Object obj) { o = obj; } 
4.  public void doSomething() { 
5.   Object o = new Object(); 
6.   doSomethingElse(o); 
7.   o = new Object(); 
8.   doSomethingElse(null); 
9.   o = null; 
10.  } 
11. } 

當DoSomething的方法被調用,之後行不符合 5中創建的對象成爲可用於垃圾回收?

A.線5

B.線6

C.線7

D.線8

E.線9

F.第10行

答案:D

爲什麼D?確實,當執行第6行時,第5行中創建的對象現在由實例var o和本地var o引用,並且當執行第8行時,對象現在僅由本地ref var o引用,爲什麼答案是D,執行第9行後會發生什麼?謝謝。

+0

智能JIT可以完全消除第9行。 –

+0

這真的取決於你正在使用的gc算法。我會說部分gc應該在第8行方法調用之後清理它,以便在eden空間中進行掃描。 – CoolBeans

+0

@CoolBeans該算法會告訴你它何時實際得到GC'd;資格由JLS決定。 – corsiKa

回答

9

這個問題令IMO感到困惑的主要原因是有兩個變量名爲o。一個是實例變量o,另一個是方法doSomething()內的局部變量o

Time   instance var o local var o 
Before Line 5:   null    
Line 5:     null  Object#1 
Line 6:    Object#1  Object#1 
Line 7:    Object#1  Object#2 
Line 8:     null  Object#2 <- No more references to Object#1 

等等(或執行後)第8行,對象#1有資格收集。

+0

現在的問題是:當第7行執行本地變量o不再引用對象#1? –

+0

@Eslam - 局部變量'o'不再引用第7行之後的對象1,而是實例變量'o'。因此,對於doSomethingElse調用nils實例var'o'的對象,直到下一行爲止纔是「可收集的」。 –

+0

但爲什麼Local var o不再在第7行之後引用object1? –

1

問題是有點混亂,因爲它後線3稱爲第二時間的對象是符合條件的,因爲它清除所述第二參考o