这可能甚至不需要询问,但我想确保我在这方面做得对。在Java中创建任何对象的数组时,如下所示:
Object[] objArr = new Object[10];
变量objArr
位于堆栈内存中,它指向堆中数组对象所在的位置。堆中该数组的大小等于12字节对象标头+ 4(或8,取决于参考大小)字节*数组中的条目数。这准确吗?
我的问题如下。由于上面的数组是空的,在执行该行代码后,它是否会在堆中占用12 + 4 * 10 = 52字节的内存?或者JVM是否会等到你在实例化之前开始将数据放入数组中?数组中的空引用是否占用空间?
答案 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