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 8或more 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)
我得到了一些相关的答案,但没有实现我的目标.
有些人根据文档给出了一些逻辑"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 word和a klass pointer.
标记字具有字大小(32位体系结构为4字节,64位体系结构为8字节)和
klass指针在32 bit体系结构上有字大小.在64 bit体系结构上,klass指针要么具有字大小,要么也可以具有4 byte堆地址可以在这些中进行编码4 bytes.
此优化称为"压缩oops",您还可以使用UseCompressedOops选项对其进行控制.