【问题标题】:memory size of int vs integer in javajava中int与整数的内存大小
【发布时间】:2017-11-10 00:41:07
【问题描述】:

我对 Java 中 int 和 Integer 变量的内存分配有疑问。为了测量内存,我使用了 Instrumentation.getObjectSize() 并且它为两个变量产生了相同的大小。请在下面找到我的代码:

ObjectSizeFetcher.java

import java.lang.instrument.Instrumentation;

public class ObjectSizeFetcher {
    private static Instrumentation instrumentation;

    public static void premain(String args, Instrumentation inst) {
        instrumentation = inst;
    }

    public static long getObjectSize(Object o) {
        return instrumentation.getObjectSize(o);
    }
}

Test.java

public class Test {
public static void main(String[] args) throws Exception {
        int i=0;
        Integer i1 = new Integer(0);
        long value = ObjectSizeFetcher.getObjectSize(i);
        System.out.println(value);//prints 16

        long value1 = ObjectSizeFetcher.getObjectSize(i1);
        System.out.println(value1);//prints 16
}
}

在上述情况下,两个可变大小打印相同。我的疑问是,int 是原始类型,它的大小为 4 个字节,而 Integer 是引用类型,它的大小为 16 个字节,但在这种情况下,为什么这两个值都产生 16 个字节?如果两者在堆中占用相同数量的内存意味着,它会导致 java 中的内存问题,对吧?

【问题讨论】:

    标签: java memory primitive-types


    【解决方案1】:

    i 在传递给getObjectSize 时自动装箱为Integer

    所以你得到了 promoted 变量大小的值,不是原始原语int

    为了规避这种行为,为原始情况构建getObjectSize重载

    public static long getObjectSize(int o) {
        return Integer.SIZE / 8;
    }
    

    等等。

    【讨论】:

      【解决方案2】:

      int 是原始类型,大小为 4 字节,Integer 是引用类型,大小为 16 字节。在这种情况下,为什么这两个值都返回 16 个字节?

      因为ObjectSizeFetcher.getObjectSize(Object) 调用将int 自动装箱为Integer

      AFAIK,没有标准的 API 来测量原始类型或引用的大小。一个原因是大小将取决于它的存储位置/方式。例如,存储在(大)byte[] 中的字节很可能比存储为对象字段的字节占用更少的空间。而持有的byte 是一个局部变量,可能又会有所不同。 (有包装和对齐问题需要解决。)

      编写重载方法来为每个基本类型返回常量最小大小很简单。引用有点棘手,因为引用的大小取决于您使用的是 32 位还是 64 位 JVM,以及是否启用了压缩 oop。

      【讨论】:

        猜你喜欢
        • 2013-05-19
        • 2023-03-31
        • 2013-04-12
        • 1970-01-01
        • 1970-01-01
        • 2011-11-01
        • 2016-07-03
        • 2014-05-24
        相关资源
        最近更新 更多