考虑以下案例
int[] anArray = new int[10];
在heap.Right上为每个 32位的10个元素分配内存?
如果元素类型是Object,那么元素的大小是多少。 ??
喜欢
Object[] objArray = new Object[10];
堆上现在分配了多少内存?我只是怀疑ArrayList
的源代码。
private transient Object[] elementData;
刚在我的机器上试过这行
List<String> s = new ArrayList<String>(Integer.MAX_VALUE);
结果
Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit
at java.util.ArrayList.<init>(Unknown Source)
at com.nextenders.server.guice.actions.servlets.Test.main(Test.java:13)
所以我想知道分配了多少内存。
答案 0 :(得分:4)
如果元素类型是Object,那么元素的大小是多少。 ??
Object[]
数组元素的大小是引用的大小。
在32位JVM上,引用为32位(4字节)
在64位JVM上,引用为64位(8字节),如果启用了“压缩oop”优化且堆大小小于32Gb,则为32位。
因此,您的数组分配将分配一个包含大约4 x 10或8 x 10字节的堆对象...以及大约12个字节的对象头开销。
刚在我的机器上试过这行
List<String> s = new ArrayList<String>(Integer.MAX_VALUE);
在封面下,您试图分配尝试分配包含2 33 和2 34 字节之间的数组。使用32位JVM,保证不起作用。使用64位JVM,您需要一堆至少8Gb(压缩oop)或16Gb才能工作。
答案 1 :(得分:0)
答案 2 :(得分:0)
它将创建一个由对象(存储对象的内存地址)的10个32位引用组成的数组,因为java中的所有对象只是指向存储对象的内存的指针。或者,如果您使用的是64位计算机,则地址将为64位