7

这可能甚至不需要问,但我想确保我是对的。当您在 Java 中创建任何对象的数组时,如下所示:

Object[] objArr = new Object[10];

该变量objArr位于堆栈内存中,它指向堆中数组对象所在的位置。堆中该数组的大小等于 12 字节对象头 + 4(或 8,取决于参考大小)字节 * 数组中的条目数。这是准确的吗?

那么,我的问题如下。由于上面的数组是空的,那么在执行那行代码之后,它是否立即占用了堆中 12 + 4*10 = 52 字节的内存?还是 JVM 会等到您开始将内容放入数组后才实例化它?数组中的空引用是否占用空间?

4

2 回答 2

7

空引用确实“占用空间”——数组的内存在一个块中预先分配,并归零(使所有内容都为空引用)。作为一个练习,尝试分配一个巨大的数组,它会占用比 JVM 的内存限制更多的空间。程序应立即因内存不足错误而终止。

于 2012-11-13T04:56:40.870 回答
2

我认为这会对你有所帮助

public static void main(String[] args) {
        Runtime r = Runtime.getRuntime();
        System.gc();
        System.out.println("Before " + r.freeMemory());
        Object[] objArr = new Object[10];
        System.out.println("After " + r.freeMemory());
        objArr[0] = new Integer(3);
        System.gc();
        System.out.println("After Integer Assigned " + r.freeMemory());
    }

输出

Before 15996360
After 15996360
After Integer Assigned 16087144
于 2012-11-13T05:05:27.617 回答