为什么ArrayList的最大数组大小为Integer.MAX_VALUE-8?

我正在学习Java 8文档ArrayList。我知道最大数组大小定义为Integer.MAX_VALUE - 8均值2 ^ 31 – 8 =

。然后,我集中讨论了为什么要减去8 why not less than 8more than 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;

有些人根据文档给出了一些逻辑"Some VMs reserve some header words in anarray"。因此,对于标题字,减去8。但是在这种情况下,如果标题字需要大于8,那么答案是什么?

请在此基础上澄清我。预先感谢您的合作。

回答:

阅读上述有关Java内存管理的文章,其中清楚指出

我认为这适用于ArrayList,因为它是Resizable array的实现。

数组对象(例如int值的数组)的形状和结构与标准Java对象的形状和结构相似。主要区别在于,数组对象还有一个额外的元数据,它表示数组的大小。然后,数组对象的元数据包括:Class:指向类信息的指针,该信息描述对象的类型。对于int字段数组,这是指向int

[]类的指针。

标志:描述对象状态的标志的集合,包括对象的哈希码(如果有的话)以及对象的形状(即,对象是否为数组)。

Lock:对象的同步信息,即对象当前是否同步。

Size:数组的大小。

最大尺寸

2^31 = 2,147,483,648

作为数组,它本身需要8 bytes存储大小 2,147,483,648

所以

2^31 -8 (for storing size ),

因此最大数组大小定义为Integer.MAX_VALUE-8

以上是 为什么ArrayList的最大数组大小为Integer.MAX_VALUE-8? 的全部内容, 来源链接: utcz.com/qa/424199.html

回到顶部