【问题标题】:Memory usage of Integer[] versus int[] : analysis using classmexer.jarInteger[] 与 int[] 的内存使用情况:使用 classmexer.jar 进行分析
【发布时间】:2015-12-10 12:23:22
【问题描述】:

尝试使用 classmexer.jar 参考 Java memory usage 来分析 Java 数组(原始数据类型与对象)中的内存使用情况。

当我尝试以下代码时,我根本无法理解输出 (我已经给出了 cmets 中每个打印语句的输出)

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

【问题讨论】:

    标签: java memory classmexer


    【解决方案1】:

    我假设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 成员占用。

    【讨论】:

    【解决方案2】:

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

    • 数组对象12字节(普通对象8字节+长度值4字节)
    • 40 = 10 * 4 个字节,用于 10 个原始 int 值
    • 4 个字节将大小填充为 8 的倍数(12 + 40 = 52,填充为 56 = 8*7)

    将数组元素设置为特定值不会更改内存大小。 浅深尺寸相同。


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

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

    如果数组的所有元素都为空,则深大小等于浅大小。

    但是如果你将数组元素设置为10个不同的Integer对象,那么这10个Integer对象的内存会被加到shallow size中:

    一个 Integer 对象需要 16 个字节:

    • 8 个字节的对象
    • 4 个字节用于内部 int 值
    • 4 字节用于填充

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

    您的问题似乎有误,它必须是 216 字节而不是 256 字节,至少在 32 位 Hotspot JVM 上是这样。需要注意的是:如果您使用不同的 JVM 供应商、JVM 版本和/或不同的处理器架构,所有这些内存数量可能会有所不同。

    【讨论】:

      猜你喜欢
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 2018-01-16
      • 2011-06-09
      • 2011-03-26
      • 2013-05-30
      相关资源
      最近更新 更多