我一直认为Java中的最大数组大小是2³¹-1,但是我无法在HotSpot上创建一个大于2³¹-4的#include<stdio.h>
int main()
{
int a=1;
int c;
c=sizeof(&a);
printf("%d\n",c);
return 0;
}
。如果我在HotSpot上进行byte[]
,我会得到:
new byte[Integer.MAX_VALUE]
我编写了以下程序以找出最大数组大小
java.lang.OutOfMemoryError: Requested array size exceeds VM limit
即使可以打印 private static void printMaxArraySize() {
int maxArraySize = findMaxArraySize();
System.out.println("max array size: " + maxArraySize);
System.out.println("max array size - Integer.MAX_VALUE: " + (Integer.MAX_VALUE - maxArraySize));
}
private static int findMaxArraySize() {
for (int i = Integer.MAX_VALUE; i >= 0; i--) {
try {
byte[] data = new byte[i];
if (System.identityHashCode(data) == 42) {
System.out.println();
}
return i;
} catch (OutOfMemoryError e) {
// ignore
}
}
throw new AssertionError("not able to create a byte[0]");
}
,我也使用JDK 8和JDK 10进行了测试
-Xmx60g -Xms60g -XX:+UseSerialGC
另一方面,OpenJ9似乎支持大小为2³¹-1的max array size: 2147483644
max array size - Integer.MAX_VALUE: 3
byte[]
修改
提出问题后,SO提示问题为JDK-8059914
编辑2
该错误表明现在使用max array size: 2147483647
max array size - Integer.MAX_VALUE: 0
代替了size_t
,因此对象大小限制实际上应该是4GB,并且int
应该起作用。
编辑3
如果我降低new byte[Integer.MAX_VALUE]
,我也会得到-Xmx
。