2016-03-02 39 views
13

我正在学习ArrayList的Java 8文档。我得到的最大数组大小定义为Integer.MAX_VALUE - 8意味着2^31 - 8 = 。那么我已经专注于为什么减去8或者减去why not less than 8more than 8为什么ArrayList的最大数组大小是Integer.MAX_VALUE - 8?

/** 
* The maximum size of array to allocate. 
* Some VMs reserve some header words in an array. 
* Attempts to allocate larger arrays may result in 
* OutOfMemoryError: Requested array size exceeds VM limit 
*/ 
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; 

我得到了一些相关的答案,但没有实现我的主旨。

  1. Do Java arrays have a maximum size?
  2. How many data a list can hold at the maximum
  3. Why I can't create an array with large size?

给予一定的逻辑有些人说,按照文件"Some VMs reserve some header words in an array"。所以对于标题词,减去8。但在这种情况下,如果标题词需要超过8个,那么答案是什么?

请在此基础上说清楚。感谢您的合作。

+5

如果需要超过800分的话,那么它会崩溃时,它得到了很大的。所以8是ArrayList作者估计需要的额外头文字的最大数量。 –

+2

在不相关的说明:如果你分配一个数组与二十亿元素,可能有什么地方错了。 – Tunaki

+0

@LouisWasserman - 在VM 8字节更高?如果可能的话,请让我知道。 – SkyWalker

回答

7

看了上面的文章关于Java Memory management,其中明确规定

我认为这也适用于ArrayList的,因为它是可调整大小的阵列实现。 Java数组对象

阵列对象的形状和结构,如int 值的阵列的

解剖学,类似于标准的Java对象的。主要的 不同之处在于数组对象具有表示数组大小的附加片段 元数据。然后,数组对象的元数据 由以下部分组成:Class:指向类信息的指针,其中 描述对象类型。在int数组的情况下,这个 是一个指向int []类的指针。

标志:标志的集合描述对象, 包括用于如果它有一个对象的哈希码的状态,并且 的对象(即,对象是否是阵列中的形状)。

锁定:对象的同步信息 - 即 对象当前是否同步。

大小:数组的大小。

最大尺寸

2^31 = 2,147,483,648 

,因为它自需要8 bytes到商店 2,147,483,648

所以

2^31 -8 (for storing size), 

所以最大阵列大小被定义为Integer.MAX_VALUE的大小的阵列 - 8

+0

对于32位和64位java进程,在两种情况下数组都需要8个字节? – SkyWalker

+1

由于对象大小被舍入为8个字节的倍数,是的。 –

3

该值是最坏的情况。注意注释:

尝试分配更大的阵列可以导致的OutOfMemoryError

这并不是说,只是可能。如果你保持在这个值以下,你应该没有问题(当然,只要内存可用)。

你可能想在回答一下这个问题的更多信息:
Why I can't create an array with large size?

5

对象头的大小不能超过8个字节。

对于热点:

对象头由a mark worda klass pointer

标记字具有字大小(在32位架构4字节,在64位架构8字节)和

的克拉斯指针32 bit架构字长。在64 bit体系结构上,klass指针或者具有字大小,但如果可以在这些4 bytes中编码堆地址,也可以具有4 byte

此优化被称为“压缩oops”,您也可以使用UseCompressedOops选项来控制它。

What is in java object header

相关问题