[英]Why the maximum array size of ArrayList is Integer.MAX_VALUE - 8?
我正在研究ArrayList
Java 8文檔。 我得到的最大數組大小定義為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;
我得到了一些相關的答案,但沒有實現我的目標。
有些人給出了一些邏輯,根據文檔"Some VMs reserve some header words in an array"
。 因此對於標題字,減去8。 但在這種情況下,如果標題詞需要超過8,那么答案是什么?
請在此基礎上澄清我。 感謝您的合作。
閱讀上面有關Java內存管理的文章,該文章明確指出
我認為這適用於ArrayList,因為它是Resizable數組實現。
Java數組對象的剖析
數組對象的形狀和結構(例如int值數組)類似於標准Java對象的形狀和結構。 主要區別在於數組對象有一段額外的元數據,表示數組的大小。 然后,數組對象的元數據包括:類:指向類信息的指針,它描述對象類型。 對於int字段數組,這是一個指向int []類的指針。
標志:描述對象狀態的標志集合,包括對象的哈希碼(如果有),以及對象的形狀(即對象是否為數組)。
鎖定:對象的同步信息 - 即對象當前是否已同步。
大小:數組的大小。
最大尺寸
2^31 = 2,147,483,648
作為數組,它自己需要8 bytes
來存儲大小2,147,483,648
所以
2^31 -8 (for storing size ),
所以最大數組大小定義為Integer.MAX_VALUE - 8
對象頭的大小不能超過8個字節。
對於HotSpot:
對象標題由a mark word
和a klass pointer
。
標記字具有字大小(32位體系結構為4字節,64位體系結構為8字節)和
klass指針在32 bit
體系結構上具有字大小。 上64 bit
架構的克拉斯指針或者具有字的大小,但也可以具有4 byte
,如果堆地址可以在這些被編碼4 bytes
。
此優化稱為“壓縮oops” ,您還可以使用UseCompressedOops選項對其進行控制。
該值是最壞的情況。 注意評論:
嘗試分配更大的數組可能會導致OutOfMemoryError
它不會說願意 ,只是可能 。 如果你保持低於這個值,你應該沒有問題(當然,只要內存可用)。
您可能需要查看此問題的答案以獲取更多信息:
為什么我無法創建大尺寸的數組?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.