整数[]与整数[]的java内存使用:使用classmexer进行分析。罐子
尝试使用classmexer分析Java数组中的内存使用情况(基本数据类型与对象)。jar引用类似的Java memory usage
当我尝试下面的代码时,我根本无法理解输出 (我在评论中给出了每个打印声明的输出)
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
# 1 楼答案
数组
int[10]
需要56个字节:将数组元素设置为特定值不会更改内存大小。 浅的和深的尺寸是一样的
同样,数组
Integer[10]
本身需要56个字节:如果数组的所有元素都为空,则深尺寸等于浅尺寸
但如果将数组元素设置为10个不同的整数对象,则10个整数对象的内存将添加到浅层大小:
一个整数对象需要16字节:
int
值现在
Integer[10]
的深度大小是56+10*16=216字节似乎你的问题中有一个输入错误,它必须是216字节,而不是256字节,至少在32位Hotspot JVM上是这样。这是一个警告:如果使用不同的JVM供应商、JVM版本和/或不同的处理器体系结构,所有这些内存数量可能会有所不同
# 2 楼答案
我假设
memoryUsageOf
给出数组使用的内存,而deepMemoryUsageOf
给出数组使用的内存+数组引用的对象使用的内存{cd3}指的是同一个数组中的^值。数组对象本身可能需要16字节的开销,每个int需要4字节(16+4*10=56)
在
Integer[]
的情况下,memoryUsageOf
为数组返回16个字节,为10个引用中的每一个返回4个字节deepMemoryUsageOf
返回16+4*10+(16+4)*1016+4
是单个整数实例占用的内存——我再次假设16个字节对于任何对象都是一个恒定的开销,int成员占用额外的4个字节