[英]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個字節:
將數組元素設置為特定值不會更改內存大小。 淺和深大小相同。
同樣,數組Integer[10]
本身需要56個字節:
如果數組的所有元素均為空,則深尺寸等於淺尺寸。
但是,如果將數組元素設置為10個不同的Integer對象,則會將10個Integer對象的內存添加到淺尺寸:
一個Integer對象需要16個字節:
int
值的4個字節 現在, Integer[10]
的深度為56 + 10 * 16 = 216個字節。
似乎您的問題中有錯字,至少在32位Hotspot JVM上,它必須是216個字節而不是256個字節。 請注意:如果您使用不同的JVM供應商,JVM版本和/或不同的處理器體系結構,則所有這些內存數量可能會有所不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.