在Object 中为元素分配多少内存

考虑以下情况

int[] anArray = new int[10]; 

在堆上为每个32位的 10个元素分配内存。对吗?

那么如果元素类型是Object,那么元素的大小是多少。 ??

喜欢

 Object[] objArray = new Object[10]; 

堆上现在分配了多少内存? 我只是怀疑ArrayList的源代码。

  private transient Object[] elementData; 

刚在我的机器上尝试过这一行

 List s = new ArrayList(Integer.MAX_VALUE); 

结果

 Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit at java.util.ArrayList.(Unknown Source) at com.nextenders.server.guice.actions.servlets.Test.main(Test.java:13) 

所以我想知道分配了多少内存。

那么如果元素类型是Object,那么元素的大小是多少。 ??

Object[]数组元素的大小是引用的大小。

  • 在32位JVM上,引用是32位(4字节)

  • 在64位JVM上,如果启用了“压缩oop”优化且堆大小小于32Gb,则引用为64位(8字节)或32位。

因此,您的数组分配将分配一个包含大约4 x 10或8 x 10字节的堆对象…以及大约12字节的对象头开销。

刚在我的机器上尝试过这一行

 List s = new ArrayList(Integer.MAX_VALUE); 

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

  1. 10 x 4bytes = 40个字节
  2. 对象存储的最大大小是256 MB可压缩,非易失性RAM存储。 可以更改对象库的大小,以自定义应用程序及其相关数据可用的持久存储量。 默认对象= x32bit中的4bytes和x64bit中的8bytes
  3. 这取决于物品的物品。 由于您没有在对象中分配任何项目,因此默认情况下将计算堆对象= 4bytes x 10 = 40bytes。

它将创建一个由对象(存储对象的存储器地址)的10个32位引用组成的数组,因为java中的所有对象只是指向存储对象的内存的指针。 或者,如果您使用的是64位计算机,则地址将为64位