2013-11-15 47 views
1

我比較了一些java集合,並發現ArrayIntList需要更多內存比平面陣列,即使您創建它具有相同的初始容量。根據它的源代碼,它只是在裏面創建相同的數組。所以我不明白。joda ArrayIntList(5000000)vs int [5000000]內存消耗

您可以在下面看到源代碼。

enter image description here

class ProfileFlatArray { 

    public static void main(String[] args) throws InterruptedException { 

     final int LEN = 5000000; 
     int[] array = new int[LEN]; 
     Random rand = new Random(); 

     for (int i = 0; i < LEN; i++) { 
      array[i] = rand.nextInt(); 
     } 

     Thread.sleep(2000); 

     for (int i = LEN - 1; i > LEN/2; i--) { 
      array[i] = 0; 
     } 

     Thread.sleep(5000); 

     System.gc(); 

     Thread.sleep(2000); 

     System.out.print(array[rand.nextInt(LEN/2 - 2)]); 

    } 
} 

而且喬達:

class ProfileArrayIntList { 

    public static void main(String[] args) throws InterruptedException { 

     final int LEN = 5000000; 
     ArrayIntList array = new ArrayIntList(LEN); 

     Random rand = new Random(); 

     for (int i = 0; i < LEN; i++) { 
      array.add(i, rand.nextInt()); 
     } 

     Thread.sleep(2000); 

     for (int i = LEN - 1; i > LEN/2; i--) { 
      array.removeIntAt(i); 
     } 
     array.optimize(); 

     Thread.sleep(5000); 

     System.gc(); 

     Thread.sleep(2000); 

     System.out.print(array.get(rand.nextInt(LEN/2 - 2))); 

    } 
} 
+0

我認爲它會調整一定量的添加以保持O(1)攤銷插入時間。所以列表的容量可能比你的初始種子大。編輯我見過你的'優化',所以從頭開始配置。 –

+0

我不知道。我試圖調試這個東西,但沒有-g選項編譯的joda-primitives。 –

+0

我已經檢查出內部數組的長度總是等於LEN。 –

回答

1

這是呼叫

array.optimize(); 

它通過第一分配一個較小尺寸的陣列壓塊一個新的數組的結果。這導致內存碰撞。然後舊陣列進行GC編輯,並導致內存降低。所以在一天結束時optimize()釋放了一半已用內存。

+0

我認爲你是對的。 –