java无法在热点中创建2/1大小的字节[]
我一直认为Java中的最大数组大小是2-1,但是我无法在HotSpot上创建大于2-4的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]");
}
即使使用-Xmx60g -Xms60g -XX:+UseSerialGC
它打印,我也使用JDK 8和JDK 10进行了测试
max array size: 2147483644
max array size - Integer.MAX_VALUE: 3
另一方面,OpenJ9似乎很好地支持2-1大小的byte[]
max array size: 2147483647
max array size - Integer.MAX_VALUE: 0
编辑
在制定了问题之后,因此建议问题是JDK-8059914
编辑2
这个bug建议现在使用size_t
而不是int
,因此对象大小限制应该是4GB,并且new byte[Integer.MAX_VALUE]
应该可以工作
编辑3
如果我降低-Xmx
,我也会得到Integer.MAX_VALUE - 2
共 (0) 个答案