2014-09-19 135 views
3

這段代碼來自一本書。現在的問題是,Java垃圾回收5

  1. 多少個對象被創建
  2. 多少個對象行//你到達的東西時,有資格GC。

的答案,根據書中,有5個和2以下是代碼:

class Dozens { 
    int[] dz = {1,2,3,4,5,6,7,8,9,10,11,12}; 
    } 

public class Eggs{ 
    public static void main(String[] args){ 
     Dozens[] da = new Dozens[3]; 
     da[0] = new Dozens(); 
     Dozens d = new Dozens(); 
     da[1] = d; 
     d = null; 
     da[1] = null; 
     // do stuff 
    } 
} 

在回答第一個問題,你是否也算INT [] DZ對象作爲每次你實例化幾十個附加對象?同樣,當你到達/ /做東西,在計算符合gc的對象的數量時,對於每個Dozens對象,你還計算其中包含的int [] dz對象嗎?

我沒算INT [] DZ對象,到達答案5和3

有人能解釋一下我可能是做錯了?

謝謝。

+0

不要忘記創建一個數組對象來存放傳遞給'main'方法的(可能是空的)命令行參數和一個String對象保存每個命令行參數(如果有的話)。 – Bobulous 2014-09-19 16:20:28

回答

4

我註釋了下面的代碼和註釋以突出引用創建或丟失的位置。

當計數分配時,必須包含存儲在字段dz中的數組的分配。我的懷疑是你計算了分配給da [0]和da [1]的對象引用的賦值。由於他們正在複製一個引用,並且不是創建一個新的對象;它們只會影響對象何時變成GCable並且不會創建新對象。

class Dozens { 
    int[] dz = {1,2,3,4,5,6,7,8,9,10,11,12}; 
} 

public class Eggs{ 
    public static void main(String[] args){ 
     Dozens[] da = new Dozens[3]; // +1 object, the array containing 3 nulls 
     da[0] = new Dozens();   // +2 objects, Dozens and the array in Dozens.dz 
     Dozens d = new Dozens();  // +2 objects, Dozens and the array in Dozens.dz 
     da[1] = d;     // +0, d now has two refs to it 
     d = null;      // +0, d now has one ref to it 
     da[1] = null;     // -2, d now has no refs to it so both d and its internal array become available for GC 
     // do stuff 
    } 
} 

總計總計爲1 + 2 + 2 = 5分配。 -2最後得出結論:2個對象已經可用於GC

+0

非常感謝您的出色解釋。它清除了我的一些誤解。再次感謝。 – user3516726 2014-09-19 16:20:05