在Object []中分配给元素的内存量

时间:2014-04-08 08:58:57

标签: java arrays memory-management

考虑以下案例

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)

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

3 个答案:

答案 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)

  1. 10 x 4bytes = 40 bytes
  2. 对象存储的最大大小为256 MB可压缩, 非易失性,RAM存储。对象存储的大小可以是 已更改为自定义可用的持久存储量 应用程序及其相关数据。默认对象= 4bytes in x32bit中的x32bit和8bytes
  3. 取决于物品的物品。既然你是 不分配对象中的任何项目,因此堆将按计算 default Object = 4bytes x 10 = 40bytes。

答案 2 :(得分:0)

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