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

Sky*_*ker 14 java arrays arraylist

我正在研究Java 8文档ArrayList.我得到的最大数组大小定义为Integer.MAX_VALUE - 8平均值2 ^ 31 - 8 = 2 147 483 639.然后,我的重点是,为什么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;
Run Code Online (Sandbox Code Playgroud)

我得到了一些相关的答案,但没有实现我的目标.

  1. Java数组是否具有最大大小?
  2. 列表最多可以容纳多少数据
  3. 为什么我无法创建大尺寸的数组?

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

请在此基础上澄清我.感谢您的合作.

Pra*_*ani 10

阅读上面有关Java内存管理的文章,该文章明确指出

我认为这适用于ArrayList,因为它是Resizable数组实现.

Java数组对象的剖析

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

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

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

大小:数组的大小.

最大尺寸

2^31 = 2,147,483,648 
Run Code Online (Sandbox Code Playgroud)

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

所以

2^31 -8 (for storing size ), 
Run Code Online (Sandbox Code Playgroud)

所以最大数组大小定义为Integer.MAX_VALUE - 8


小智 5

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

对于HotSpot:

对象头包含a mark worda klass pointer.

标记字具有字大小(32位体系结构为4字节,64位体系结构为8字节)和

klass指针32 bit体系结构上有字大小.在64 bit体系结构上,klass指针要么具有字大小,要么也可以具有4 byte堆地址可以在这些中进行编码4 bytes.

此优化称为"压缩oops",您还可以使用UseCompressedOops选项对其进行控制.

什么是java对象头文件