簡體   English   中英

為什么ArrayList的最大數組大小是Integer.MAX_VALUE - 8?

[英]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 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;

我得到了一些相關的答案,但沒有實現我的目標。

  1. Java數組是否具有最大大小?
  2. 列表最多可以容納多少數據
  3. 為什么我無法創建大尺寸的數組?

有些人給出了一些邏輯,根據文檔"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 worda klass pointer

標記字具有字大小(32位體系結構為4字節,64位體系結構為8字節)和

klass指針32 bit體系結構上具有字大小。 64 bit架構的克拉斯指針或者具有字的大小,但也可以具有4 byte ,如果堆地址可以在這些被編碼4 bytes

此優化稱為“壓縮oops” ,您還可以使用UseCompressedOops選項對其進行控制。

什么是java對象頭文件

該值是最壞的情況。 注意評論:

嘗試分配更大的數組可能會導致OutOfMemoryError

它不會說願意 ,只是可能 如果你保持低於這個值,你應該沒有問題(當然,只要內存可用)。

您可能需要查看此問題的答案以獲取更多信息:
為什么我無法創建大尺寸的數組?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM