我已阅读此问题的一些答案(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