Kev*_*ion 174
没有看到正确的答案,即使它很容易测试.
在最近的HotSpot VM中,正确的答案是Integer.MAX_VALUE - 5
.一旦你超越了:
public class Foo {
public static void main(String[] args) {
Object[] array = new Object[Integer.MAX_VALUE - 4];
}
}
Run Code Online (Sandbox Code Playgroud)
你得到:
Exception in thread "main" java.lang.OutOfMemoryError:
Requested array size exceeds VM limit
Run Code Online (Sandbox Code Playgroud)
Pac*_*ier 122
这(当然)完全取决于VM.
通过OpenJDK的7和8的源代码浏览java.util.ArrayList
,.Hashtable
,.AbstractCollection
, .PriorityQueue
,和.Vector
,可以看到这个权利要求进行重复:
Run Code Online (Sandbox Code Playgroud)/** * 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;
由Martin Buchholz(谷歌)于2010-05-09添加 ; 由Chris Hegarty(Oracle)审核.
所以, 也许 我们可以说,最大的"安全"的数目将是 2 147 483 639(Integer.MAX_VALUE - 8
)和"尝试分配更大的阵列可能会导致OutOfMemoryError错误 ".
(是的,Buchholz的独立声明不包括支持证据,因此这是对权威的计算吸引力.即使在OpenJDK本身,我们也可以看到代码,如同return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;
哪些节目MAX_ARRAY_SIZE
尚未真正使用.)
wor*_*ing 27
通过这篇文章http://en.wikipedia.org/wiki/Criticism_of_Java#Large_arrays:
Java因不支持超过2 31 -1(约21亿)元素的数组而受到批评.这是语言的限制; Java语言规范第10.4节规定:
数组必须由int值索引...尝试访问具有长索引值的数组组件会导致编译时错误.
支持大型阵列也需要更改JVM.这种限制表现在诸如集合被限制为20亿个元素以及无法存储大于2 GiB的映射文件的区域中.Java还缺少真正的多维数组(连续分配由单个间接访问的单个内存块),这限制了科学和技术计算的性能.
Dha*_*uka 10
数组是非负整数索引,因此您可以访问的最大数组大小Integer.MAX_VALUE
.另一件事是你可以创建多大的数组.它取决于您可用的最大内存JVM
和阵列的内容类型.每个数组元素都有它的大小,例如.byte = 1 byte
,int = 4 bytes
,Object reference = 4 bytes (on a 32 bit system)
因此,如果您的计算机上有1 MB
可用内存,则可以分配一个byte[1024 * 1024]
或多个数组Object[256 * 1024]
.
回答你的问题 - 你可以分配一个大小的数组(最大可用内存/数组项的大小).
总结 - 从理论上讲,数组的最大大小将是Integer.MAX_VALUE
.实际上,它取决于您JVM
拥有多少内存以及已经分配给其他对象的内存量.