簡體   English   中英

Integer []與int []的內存使用情況:使用classmexer.jar進行分析

[英]Memory usage of Integer[] versus int[] : analysis using classmexer.jar

嘗試使用classmexer.jar並參考類似的Java內存使用情況來分析Java數組中的內存使用情況(原始數據類型與對象)。

當我嘗試以下代碼時,我根本無法理解輸出(我在注釋中給出了每個打印語句的輸出)

Integer[] intObjArray = new Integer[10];
System.out.println(MemoryUtil.memoryUsageOf(intObjArray)); // 56
System.out.println(MemoryUtil.deepMemoryUsageOf(intObjArray)); // 56
for (int j  =0; j< intObjArray.length ; j++) {
    intObjArray[j] =  new Integer(j);
}
System.out.println(MemoryUtil.memoryUsageOf(intObjArray)); //56
System.out.println(MemoryUtil.deepMemoryUsageOf(intObjArray)); //256


int[] intArray = new int[10];
System.out.println(MemoryUtil.memoryUsageOf(intArray)); //56
System.out.println(MemoryUtil.deepMemoryUsageOf(intArray)); //56
for (int j  =0; j< intArray.length ; j++) {
    intArray[j] =  10;
}
System.out.println(MemoryUtil.memoryUsageOf(intArray)); //56
System.out.println(MemoryUtil.deepMemoryUsageOf(intArray)); //56

我假設memoryUsageOf提供了數組使用的內存,而deepMemoryUsageOf提供了數組使用的內存+數組引用的對象使用的內存。

int[]的情況下,兩者均返回相同的值,因為該數組未引用任何對象。 數組對象本身可能需要16個字節的開銷,而每個int則需要4個字節(16 + 4 * 10 = 56)。

對於Integer[]memoryUsageOf返回數組的16個字節+ 10個引用中的每一個返回4個字節。

deepMemoryUsageOf返回16 + 4 * 10 +(16 + 4)* 10。 16+4是單個Integer實例占用的內存-再次假設16個字節是任何對象的恆定開銷,而另外4個字節則由int成員占用。

數組int[10]需要56個字節:

  • 數組對象12個字節(普通對象8個字節,長度值4個字節)
  • 10個原始int值的40 = 10 * 4個字節
  • 4個字節以將大小填充為8的倍數(12 + 40 = 52,填充為56 = 8 * 7)

將數組元素設置為特定值不會更改內存大小。 淺和深大小相同。


同樣,數組Integer[10]本身需要56個字節:

  • 數組對象12個字節
  • 40 = 10 * 4個字節(用於10個對象引用)
  • 4個字節以將大小填充為8的倍數

如果數組的所有元素均為空,則深尺寸等於淺尺寸。

但是,如果將數組元素設置為10個不同的Integer對象,則會將10個Integer對象的內存添加到淺尺寸:

一個Integer對象需要16個字節:

  • 對象的8個字節
  • 內部int值的4個字節
  • 4個字節用於填充

現在, Integer[10]的深度為56 + 10 * 16 = 216個字節。

似乎您的問題中有錯字,至少在32位Hotspot JVM上,它必須是216個字節而不是256個字節。 請注意:如果您使用不同的JVM供應商,JVM版本和/或不同的處理器體系結構,則所有這些內存數量可能會有所不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM