Java OutOfMemory堆空间

时间:2014-04-09 11:34:00

标签: java out-of-memory heap-memory

大家。我正在做一个项目。一路上,我用这行代码得到了“OutOfMemory”问题......

this.A = new int[n][n];

...对于n = 10000;

我尝试通过添加-Xmx2048m命令来修复它,但事情是在添加时,所有其余正在运行的程序都停止响应。对我的案子还有其他建议吗?非常感谢

3 个答案:

答案 0 :(得分:2)

您必须计算数组所需的空间。如果超过2048M,那么您将收到OutOfMemoryError

在您的情况下,您尝试分配10000 x 10000 100.000.000的数组。

原始int占用4个字节。这意味着整个数组需要

100.000.000 * 4个字节,即0,37 GB个空格。

所以你的程序中还有其他东西可以解决错误。例如,如果您尝试在循环中分配多个数组,那么您可以快速耗尽内存。

如果您的硬件没有2048M内存,则可能会出现问题。

也可能在使用-Xmx2048m之前,例如-Xmx512m可能对您的数组来说太小了。

答案 1 :(得分:0)

使用此:

Increase heap size in Java

-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size
-Xss<size>        set java thread stack size

java -Xms16m -Xmx64m ClassName

答案 2 :(得分:0)

让我们看看......

int在内存中占用32位或4个字节。
因此你的二维阵列需要 10000 * 10000 * 4字节= 400000000字节= 381.47 MB​​ (加上数组对象的存储空间)

让我们通过一个简单的测试验证:

int n = 10000;
int[][] foo = new int[n][n];
System.out.println("USED MEMORY: " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / 1024 / 1024);

结果:384 MB(在我的机器上,您的结果可能会有所不同)。

当无法分配请求的内存块时,会发生堆内存不足,内存已满时

当您以40&#000; 000字节的块分配内存时,如果没有可用的连续可用内存,则可能会耗尽内存(数百个块少于40&#39) ; 000在这里没有帮助)。这意味着当堆上的可用内存被分割为小内存块时,您可以轻松地耗尽内存。

如果您碰巧连续多次分配该内存,请尝试重用已分配的内存,而不是再次分配(以防止碎片到某种程度)。 或者,尝试使用较小的数组(即使它意味着使用更多的数组)。