首页 > 解决方案 > 即使 int 数组值存在于范围内,Java 运行时错误

问题描述

允许的最大int数据类型数组范围是 2147483647。但我得到了

运行时错误:线程“main”中的异常 java.lang.OutOfMemoryError:Test.main 处的 Java 堆空间(Test.java:3)

有人可以解释一下这个大小的内存表示以及为什么 JVM 会为此引发运行时错误吗?

代码:

class Test{
    public static void main(String[] args){
        int [] x = new int[1000000000];
    }
}

标签: java

解决方案


您正在使用特定 JVM 或系统内存的限制。

您正在尝试分配一个将占用约 4GB 连续内存的数组。我希望机器上的 64 位 JVM 有足够的内存来处理它而不会出现任何问题,但是不同的 JVM 可能有不同的限制。例如,我希望任何 32 位 JVM 都会遇到这种情况。

好消息是,在常规编程中几乎不需要分配这么大的数组。如果您确实需要它,则需要确保您在支持它的环境中工作。

即使在可以处理您的示例的机器上,如果我进一步增加大小,我也会遇到两个错误之一,您得到的错误之一是:

线程“主”java.lang.OutOfMemoryError 中的异常:Java 堆空间

或 2147483646 或 2147483647:

线程“主”java.lang.OutOfMemoryError 中的异常:请求的数组大小超过 VM 限制

(第一个发生在我机器上的 1064000000 和 1065000000 之间。)


推荐阅读