考虑以下情况

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[] 数组元素的大小是引用的大小。

  • 在 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);
    

    在幕后,您正在尝试分配尝试分配包含 233 到 234 个字节的数组。使用 32 位 JVM,这保证不起作用。使用 64 位 JVM,您需要至少 8Gb(压缩 oop)或 16Gb 的堆才能工作。

    关于java - 为 Object[] 中的元素分配了多少内存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22932251/

    10-10 00:58
    查看更多