继续获取:请求的数组大小超过VM限制错误

时间:2015-09-02 17:36:37

标签: java out-of-memory

我在这里看到了几个关于接收java错误的线程:java.lang.OutOfMemoryError:请求的数组大小超过了VM限制,但我已经尝试过这些建议,但没有一个对我有用。以下是我使用的脚本:

maps[0].f_ptr = (void *(*)(void*)) &fact;
ans2 = (int) maps[i].f_ptr((void*) num);

我尝试了各种不同的选项,例如将-Xmx参数增加到20g并删除MaxPermSize参数(我也尝试将其降低到256m)。我在不使用UseCompressedOops参数的情况下运行它。

我之前运行过这个脚本(没有MaxPermSize和UsedCompressedOops参数)并且完全没有问题,所以我不确定为什么在这个样本上它不会运行。

有没有人对问题是什么有任何其他想法?您认为我的bam文件存在问题吗?

注意:我确实在输出目录中收到了一个文件,但它是空的。

谢谢,

莱斯利

1 个答案:

答案 0 :(得分:2)

java中的数组受限于数组索引的类型为int,索引必须为正数(以及数组大小)。

但VM中可能存在限制,阻止使用大小为Integer.MAX_VALUE((2 ^ 31)-1)的数组;确切的最大值似乎是特定于VM的实现。因此,当请求的数组长度为Integer.MAX_VALUE或非常接近时,VM可能会抛出异常。请注意,通过为VM分配更多内存,无法解决此因为VM的实施方式导致的限制。

更糟糕的是,据我所知,JDK中没有任何常量/方法可用,它实际上表示VM支持的实际最大阵列大小;因此,对于这种情况,它可以安全地进行硬编码。

可能有一种方法可以阻止程序通过更改其参数来尝试分配该大小的数组。您最好的选择是直接从您的软件决定的供应商/帮助论坛寻求帮助。切换到不同的VM(版本或供应商)也可以解决问题;如果另一个VM真正支持最大大小的数组。