无法在HotSpot中创建2³¹-1大小的字节[]

时间:2018-07-03 06:22:41

标签: java arrays jvm-hotspot

我一直认为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

0 个答案:

没有答案