考虑以下情况
int[] anArray = new int[10];
为堆上每个 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)
所以我想知道分配了多少内存。
最佳答案
Object[]
数组元素的大小是引用的大小。
所以你的数组分配将分配一个包含大约 4 x 10 或 8 x 10 字节的堆对象......加上大约 12 字节的对象头开销。
List<String> s = new ArrayList<String>(Integer.MAX_VALUE);
在幕后,您正在尝试分配尝试分配包含 233 到 234 个字节的数组。使用 32 位 JVM,这保证不起作用。使用 64 位 JVM,您需要至少 8Gb(压缩 oop)或 16Gb 的堆才能工作。
关于java - 为 Object[] 中的元素分配了多少内存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22932251/