Java中int和integer的内存大小有何区别?

4

我对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中的内存问题,对吗?
2个回答

4

当传递给getObjectSize时,i会自动转换为Integer

因此,您获得的是提升变量的大小值,而不是原始的基本类型int

要解决这个问题,请为基本情况构建重载getObjectSize

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

等等。


3
“int”是一种原始类型,其大小为4个字节,“Integer”是引用类型,大小为16个字节。在这种情况下,为什么两个值都返回16个字节呢?
因为“ObjectSizeFetcher.getObjectSize(Object)”调用将“int”自动装箱为“Integer”。
据我所知,没有标准API来测量原始类型或引用的大小。一个原因是大小取决于它存储的位置和方式。例如,存储在(大)byte[]中的字节很可能占用的空间比存储为对象字段的字节少。而一个保存在本地变量中的byte可能又不同了。(还有打包和对齐的问题要考虑。)
编写重载方法以返回每个原始类型的常量最小大小非常简单。引用类型会更棘手一些,因为引用大小取决于您是否使用32位或64位JVM,以及是否启用了压缩oops。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接