有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案