大家。我正在做一个项目。一路上,我用这行代码得到了“OutOfMemory”问题......
this.A = new int[n][n];
...对于n = 10000;
我尝试通过添加-Xmx2048m
命令来修复它,但事情是在添加时,所有其余正在运行的程序都停止响应。对我的案子还有其他建议吗?非常感谢
答案 0 :(得分:2)
您必须计算数组所需的空间。如果超过2048M,那么您将收到OutOfMemoryError
。
在您的情况下,您尝试分配10000 x 10000
100.000.000
的数组。
原始int
占用4
个字节。这意味着整个数组需要
100.000.000 * 4
个字节,即0,37 GB
个空格。
所以你的程序中还有其他东西可以解决错误。例如,如果您尝试在循环中分配多个数组,那么您可以快速耗尽内存。
如果您的硬件没有2048M
内存,则可能会出现问题。
也可能在使用-Xmx2048m
之前,例如-Xmx512m
可能对您的数组来说太小了。
答案 1 :(得分:0)
使用此:
-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在这里没有帮助)。这意味着当堆上的可用内存被分割为小内存块时,您可以轻松地耗尽内存。
如果您碰巧连续多次分配该内存,请尝试重用已分配的内存,而不是再次分配(以防止碎片到某种程度)。 或者,尝试使用较小的数组(即使它意味着使用更多的数组)。