Java 整数[]与整数[]的内存使用:使用classmexer.jar进行分析

Java 整数[]与整数[]的内存使用:使用classmexer.jar进行分析,java,memory,classmexer,Java,Memory,Classmexer,尝试使用classmexer.jar参考类似内容分析Java数组中的内存使用情况(基本数据类型与对象) 当我尝试下面的代码时,我根本无法理解输出 (我在评论中给出了每个打印语句的输出) Integer[]intObjArray=新整数[10]; System.out.println(MemoryUtil.memoryUsageOf(intObjArray));//56 System.out.println(MemoryUtil.deepMemoryUsageOf(intObjArray));//

尝试使用classmexer.jar参考类似内容分析Java数组中的内存使用情况(基本数据类型与对象)

当我尝试下面的代码时,我根本无法理解输出 (我在评论中给出了每个打印语句的输出)

Integer[]intObjArray=新整数[10];
System.out.println(MemoryUtil.memoryUsageOf(intObjArray));//56
System.out.println(MemoryUtil.deepMemoryUsageOf(intObjArray));//56
对于(int j=0;j
我假设
memoryUsageOf
给出数组使用的内存,
deepMemoryUsageOf
给出数组使用的内存+数组引用的对象使用的内存

int[]
的情况下,两者返回相同的值,因为数组不引用任何对象。数组对象本身可能有16个字节的开销,每个int加上4个字节(16+4*10=56)

对于
Integer[]
memoryUsageOf
为数组返回16个字节,为10个引用中的每一个返回4个字节


deepMemoryUsageOf
返回16+4*10+(16+4)*10
16+4
是单个整数实例占用的内存-我再次假设16个字节是任何对象的恒定开销,另外4个字节由int成员占用。

数组
int[10]
需要56个字节:

  • 数组对象为12字节(普通对象为8字节+长度值为4字节)
  • 40=10*4字节表示10个基本整数值
  • 4个字节将大小填充为8的倍数(12+40=52,填充为56=8*7)
将数组元素设置为特定值不会更改内存大小。 浅的和深的尺寸是一样的


同样,数组
整数[10]
本身需要56个字节:

  • 数组对象为12字节
  • 40=10*4字节,用于10个对象引用
  • 4字节将大小填充为8的倍数
如果数组的所有元素都为空,则深尺寸等于浅尺寸

但如果将数组元素设置为10个不同的整数对象,则10个整数对象的内存将添加到浅层大小:

一个整数对象需要16个字节:

  • 对象的字节数为8
  • 4个字节用于内部
    int
  • 4个字节用于填充
现在,
整数[10]
的深度大小是56+10*16=216字节


似乎您的问题中有一个输入错误,它必须是216字节,而不是256字节,至少在32位Hotspot JVM上是这样。这是一个警告:如果您使用不同的JVM供应商、JVM版本和/或不同的处理器体系结构,那么所有这些内存编号可能会有所不同。

我们得到了16个字节的数组。link说数组应该是12,普通对象应该是8。。对不起,可能是我糊涂了。。
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