创建Java对象数组后,它的内存大小是多少?

时间:2012-11-13 04:54:40

标签: java arrays memory

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

Object[] objArr = new Object[10];

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

我的问题如下。由于上面的数组是空的,在执行该行代码后,它是否会在堆中占用12 + 4 * 10 = 52字节的内存?或者JVM是否会等到你在实例化之前开始将数据放入数组中?数组中的空引用是否占用空间?

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分: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