有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

整数[]与整数[]的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

共 (2) 个答案

  1. # 1 楼答案

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

    • 数组对象为12字节(普通对象为8字节+长度值为4字节)
    • 40=10*4字节代表10个基本整数值
    • 4字节将大小填充为8的倍数(12+40=52,填充为56=8*7)

    将数组元素设置为特定值不会更改内存大小。 浅的和深的尺寸是一样的


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

    • 数组对象为12字节
    • 40=10*4字节,用于10个对象引用
    • 4字节将大小填充为8的倍数

    如果数组的所有元素都为空,则深尺寸等于浅尺寸

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

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

    • 对象的字节数为8
    • 4字节用于内部int
    • 4字节用于填充

    现在Integer[10]的深度大小是56+10*16=216字节

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

  2. # 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个字节