我已閱讀此問題的一些答案(Why I can't create an array with large size?和https://bugs.openjdk.java.net/browse/JDK-8029587),我不理解以下內容。 「在GC代碼中,我們將字中大小的對象作爲int來傳遞。」據我所知,JVM中一個單詞的大小是4個字節。據此,如果我們以int的形式傳遞長整型大數組(例如,MAX_INT - 5)的大小,我們必須通過得到OutOfMemoryException請求的數組大小超過了VM限制,因爲大小太大即使沒有標題大小也是如此。那麼爲什麼不同類型的數組對最大元素數有相同的限制?爲什麼在Java中創建一個MAX_INT大小的數組是不可能的?
回答
只處理爲什麼不同類型的數組對最大元素數有相同的限制?部分:
因爲它在實際中並不重要,但允許實現JVM的代碼更簡單。
當只有一個限制;對於各種陣列來說都是一樣的;那麼你可以使用該代碼處理所有數組。而不是有很多類型特定的代碼。
並且考慮到需要「大」數組的人仍然可以創建它們;只有那些需要真的很大的陣列受到影響;爲什麼花了這個努力?
的字節數組如果該限制是基於long類型的,那很明顯。我無法理解,如果無法使用int變量索引該數組的單詞,我不能理解如何創建一個長整型數組(MAX_INT - 1)。 – WildWind03
我不得不承認在寫回答時我很忙。如果您當時沒有收到更好的輸入,我可能會在明天更新它。 – GhostCat
答案是在jdk中,據我所知(我在看jdk-9);還寫它之後,我不知道這是否應該是一個評論,而不是(如果它回答您的問題),但它是一個評論太長......
首先錯誤是來自hotspot/src/share/vm/oops/arrayKlass.cpp
這裏拋出:
if (length > arrayOopDesc::max_array_length(T_ARRAY)) {
report_java_out_of_memory("Requested array size exceeds VM limit");
....
}
,T_ARRAY
實際上是BasicType
類型的枚舉,看起來像這樣:
public static final BasicType T_ARRAY = new BasicType(tArray);
// tArray is an int with value = 13
這是第一個跡象表明,計算的最大尺寸時,JDK不護理該數組將保存什麼(T_ARRAY
未指定該數組將保存哪些類型)。
現在,真正驗證了最大的數組大小的方法是這樣的:
static int32_t max_array_length(BasicType type) {
assert(type >= 0 && type < T_CONFLICT, "wrong type");
assert(type2aelembytes(type) != 0, "wrong type");
const size_t max_element_words_per_size_t =
align_size_down((SIZE_MAX/HeapWordSize - header_size(type)), MinObjAlignment);
const size_t max_elements_per_size_t =
HeapWordSize * max_element_words_per_size_t/type2aelembytes(type);
if ((size_t)max_jint < max_elements_per_size_t) {
// It should be ok to return max_jint here, but parts of the code
// (CollectedHeap, Klass::oop_oop_iterate(), and more) uses an int for
// passing around the size (in words) of an object. So, we need to avoid
// overflowing an int when we add the header. See CRs 4718400 and 7110613.
return align_size_down(max_jint - header_size(type), MinObjAlignment);
}
return (int32_t)max_elements_per_size_t;
}
我沒有去跳水進過多的代碼,但它是基於HeapWordSize
;這是8 bytes at least
。 here是一個很好的參考(我試圖把它看成代碼本身,但有太多的參考)。
爲什麼HeapWordSize至少需要8個字節?我在這裏找到http://hg.openjdk.java.net/jdk6/jdk6/hotspot/file/tip/src/share/vm/utilities/globalDefinitions.hpp MaxHeapSize = sizeof(HeapWord)和HeapWord類只有一個字段char *類型。這意味着HeapWordSize的大小取決於體系結構,也可能是4個字節。 – WildWind03
@Wild_Wind你是對的,我不是。在這一點上,我有同樣的鬥爭低估,你做。 – Eugene
- 1. 在CoDeSys中創建一個具有可變大小的數組
- 2. 爲什麼不可能在C++中創建一個引用數組?
- 3. 爲什麼你不能在C++中使用一個數組大小的變量?
- 4. 爲什麼這個數組創建不能在php7中工作?
- 5. 爲什麼不能創建堆棧大小小於默認大小的線程?
- 6. 在Excel 2003中創建可變大小的組合的好方法是什麼?
- 7. 爲什麼我能夠創建僅在運行時已知的大小數組?
- 8. 爲什麼我不能創建一個自動變量數組?
- 9. 是否可以在C++中動態創建一個常量大小的數組?
- 10. 爲什麼WinAPI不能創建配置大小的窗口?
- 11. 爲什麼我無法創建一個新的Java數組?
- 12. 如何在c中創建一個不同大小的數組的數組?
- 13. 我可以在C++中創建一個不同大小的向量數組嗎?
- 14. 爲什麼空數組的大小爲0但空類的大小不是0?
- 15. 爲什麼不能在Magento中創建一個新的DIV?
- 16. 創建可變大小的數組
- 17. 爲什麼我不能創建一個大小由全局變量確定的數組?
- 18. 根據updown的大小創建一個全局可用數組
- 19. 爲什麼我們使用指針而不是簡單地創建一個特定大小的數組?
- 20. 什麼是java中的零大小數組?
- 21. 創建的int數組,其大小是基於一個NSArray
- 22. 爲什麼我不能在CSS中創建一個可以工作的頁腳?
- 23. 是否可以在Java中創建一個BufferedWriters數組?
- 24. Python創建一個大小爲numpy的數組
- 25. 如何創建一個大小爲40,000的C++ bool 2D數組?
- 26. 爲什麼你不能把一個變量作爲一個多維數組大小放在Go中?
- 27. 可能從文件創建兩個不同大小的數組/矩陣?
- 28. 爲什麼一個deque的大小會少於一個小數?
- 29. 爲什麼不能我創建了一個名爲POW()函數
- 30. 不能在C中創建自定義數組大小表?
他們沒有。限制是單詞中的分配大小和元素數量必須符合一個帶符號的32位整數。對於引用類型的數組,該大小與元素的數量相同(禁止可能的標題字)。對於字節/短,大小上限將不會被打。在32位平臺上,我認爲很長時間[]會被限制在axint/2項(大致)。 – Zastai
在你的問題中有這個問題的答案(第一評論):https://bugs.openjdk.java.net/browse/JDK-8029587 – vhula
@ Zastai如果這是真的,那麼不會有任何問題,但實際上示例我無法創建MAX_INT大小爲 – WildWind03