有两种限制。
一是规范隐含的限制。
Java数组的length必须是非负的int,
所以它的理论最大值就是java.lang.Integer.MAX_VALUE = 2^31-1 = 2147483647。
二是具体的实现带来的限制。
这会使得实际的JVM不一定能支持上面说的理论上的最大length。例如说如果有JVM使用uint32_t来记录对象大小的话,那可以允许的最大的数组长度(按元素的个数计算)就会是:
(uint32_t的最大值 - 数组对象的对象头大小) / 数组元素大小
于是对于元素类型不同的数组,实际能创建的数组的最大length也会不同。JVM实现里可以有许多类似的例子会影响实际能创建的数组大小。
作者:RednaxelaFX 链接:https://www.zhihu.com/question/31809233/answer/53370790 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
The count must be of type int.
if count is less than zero, the anewarray instruction throws a NegativeArraySizeException.
/**
* 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;
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
// 正常一次扩容为原容量的 3/2
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
// 新容量溢出,或者新容量依旧没有达到 minCapacity
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
@see
UidGenerator
// todo