我正在尝试初始化一个布尔类型的数组,其大小为10位数字。它一直抛出OutOfMemoryException。我已将Eclipse的堆空间大小从256增加到1024。我是否还有遗漏需要补充?
int size = 1000000000;
boolean[] primesList = new boolean[size];
我正在尝试初始化一个布尔类型的数组,其大小为10位数字。它一直抛出OutOfMemoryException。我已将Eclipse的堆空间大小从256增加到1024。我是否还有遗漏需要补充?
int size = 1000000000;
boolean[] primesList = new boolean[size];
boolean
数组,它会将位压缩到八分之一的空间中。Runtime.getRuntime().maxMemory()
的值以找出Java正在使用的最大堆大小。对于1024 MB,参数应为-Xmx1024M
。1_000_000_000
而不是1000000000
。来自文档
这种数据类型代表一位信息,但它的“大小”并没有被精确地定义。
如果您考虑布尔值至少需要一个字节,那么使用1000000000
个字节的数组需要953MB
的内存。
因此,这是唯一占用了1024MB
中953MB
的数组,这可能导致问题。
但在一个好的世界里,我想这种情况不会发生 :)
只需请求更多的堆大小,例如-X1500M绝对有效。你的数组占用了1000000000字节,但是你需要请求更多的空间,因为Java堆被分成新生代和老年代。
布尔数组以字节形式存储:
https://forums.oracle.com/thread/2550321
我认为你需要重新考虑你正在做的事情 - 创建大小在几千兆字节以上的数据结构已经超出了当前硬件的能力范围。
这可能是由于以下两个原因之一:
根据this文章,JVM不会将整个Xmx分配给您的程序。其中一个survivor空间占用的空间被折扣,因为JVM在内部使用它进行一些簿记或临时使用。这可能是为什么在这种情况下1024 MB不足够,因为您的数组已经使用了954 MB。survivor空间可能超过70 MB。增加Xmx可能有助于解决问题,也可能无法解决问题,如下面所述。