Java运行时错误,即使int数组值在范围内

Java运行时错误,即使int数组值在范围内,java,Java,允许的最大int数据类型数组范围为2147483647。但是我越来越 运行时错误:线程“main”java.lang.OutOfMemoryError中出现异常错误: Test.main处的Java堆空间(Test.Java:3) 有人能给我解释一下这种大小的内存表示,以及为什么JVM会为此引发运行时错误吗 代码: 您提到了可存储在int中的最大数字,即2147483647 但是你正在创建一个十亿整数的数组。这是两件不同的事情 基本上,您占用100000000*4字节,因为一个int的大小是4字

允许的最大
int
数据类型数组范围为2147483647。但是我越来越

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

有人能给我解释一下这种大小的内存表示,以及为什么JVM会为此引发运行时错误吗

代码:


您提到了可存储在
int
中的最大数字,即2147483647

但是你正在创建一个十亿整数的数组。这是两件不同的事情


基本上,您占用100000000*4字节,因为一个int的大小是4字节。这就产生了大约4GB的内存

默认情况下,int数据类型是32位带符号2的补码整数。你声明了一个10亿个这样的数组

有关基本数据类型的更多信息,请访问


您可以考虑增加可用内存(请参阅),或者考虑使用Collections API,这可能比原始数组更适合您的需要。

您正在使用的特定JVM或系统内存达到极限

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

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

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

线程“main”java.lang.OutOfMemoryError中出现异常:java堆空间

或2147483646或2147483647:

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


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

通常,当Java虚拟机无法分配对象时会抛出此错误,因为该对象内存不足,垃圾收集器无法提供更多内存。 “int[100000000]”正在消耗大量Java堆空间,当堆区域中的所有可用内存都已填满且垃圾收集无法清理时,会抛出Java.lang.OutOfMemoryError:Java堆空间。
4GB是一个很大的空间

我认为这是一个古老的问题。。我会解释一下:

Java代码在Java虚拟机(JVM)上运行默认情况下,这台机器有一些限制,这就是为什么会出现这种情况:

int[] array : 4 byte
0 l=1048576 s=4mb
1 l=2097152 s=8mb
java.lang.OutOfMemoryError: Java heap space l=4194304 s=16mb
如何在您的环境中“修复”它? 很简单,只需添加一个VM标志即可运行应用程序
-Xmx12g

注: 请记住,实际上,JVM数组的大小受其内部表示形式的限制。在GC代码中,JVM将堆字中的数组大小作为
int
传递,然后将堆字转换回
jint
,这可能会导致溢出。因此,为了避免崩溃和意外行为,最大数组长度受此
max size-header size
限制。其中
头大小
取决于用于构建您正在运行的JVM的C/C++编译器(即用于linux的gcc、用于macos的clang)和运行时设置(即使用压缩类指针)。例如,在我的Linux环境中,限制是:

Java HotSpot(TM) 64-Bit Server VM 1.6.0_45 limit Integer.MAX_VALUE
Java HotSpot(TM) 64-Bit Server VM 1.7.0_72 limit Integer.MAX_VALUE-1
Java HotSpot(TM) 64-Bit Server VM 1.8.0_40 limit Integer.MAX_VALUE-2

10亿个整数可能与整数的大小相同,然后将其乘以
100000000
,然后确保有足够的内存,并确保有足够的内存heap@SrinivasanSekar:它正试图分配不到4GB的内存。JVM显然无法处理这个问题,但它的内存量很小。@Srinivassansekar:你的可能可以-我的笔记本电脑有16GB,可以很好地处理这个代码。不需要服务器——只需要一台有足够内存的机器和一个能够处理它的JVM。为什么“当然”呢?我认为,希望现代JVM能够处理这种大小的数组并不是不合理的。在我看来,4GB并不是一个难以想象的内存分配量。
Java HotSpot(TM) 64-Bit Server VM 1.6.0_45 limit Integer.MAX_VALUE
Java HotSpot(TM) 64-Bit Server VM 1.7.0_72 limit Integer.MAX_VALUE-1
Java HotSpot(TM) 64-Bit Server VM 1.8.0_40 limit Integer.MAX_VALUE-2