我在查看以下文章: Increase heap size in Java
现在我有一个需要大约5GB内存的程序,并且在执行文章中讲述的内容时(通过在arguments字段中使用-Xmx5g来增加堆大小),我仍然得到
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
我的系统是Windows 7(64位),内存为8GB。难道我做错了什么?如果是的话,我该怎样继续获得5GB的堆内存,否则我的系统无法处理?
注意:我必须使用具有所有非零值的25K * 25K大小的2D矩阵进行计算。因此我也不能使用稀疏矩阵。
答案 0 :(得分:2)
OutOfMemoryError
。如果你定义了5G
的堆,这几乎肯定意味着你有一种内存泄漏。例如,我可以编写非常简单的代码,在任何环境下都会导致OutOfMemoryError
:
List<String> list = new LinkedList<>();
while(true) {
list.add("a");
}
运行此代码并等待几秒钟。 OutOfMemoryError
将被抛出。这是因为我将列表添加到列表中并且从不清除它。
我相信你的应用会发生类似的事情。
我理解,它不像我的例子那么简单,所以你可能不得不使用分析器来调试它并理解你的内存泄漏的原因。
编辑:
我刚刚看到你正在使用25K * 25K martrix。这意味着你有625M细胞。您还没有提到矩阵的类型,但如果它是int
占用4个字节,则需要625 * 4 = 2500M = 2.5G内存,因此5G应该足够了。
请尝试分析您的计划中发生了什么以及您的记忆花费在哪里。
答案 1 :(得分:1)
5G /(25K * 25K)~8个字节。
慷慨地假设您的程序不使用除该矩阵之外的内存,每个矩阵元素必须占用不超过8个字节。
您应该至少计算大致的内存要求,以检查是否可以在硬件上处理这种大小的问题。例如,如果您需要一个MxN大小为double
值的二维数组,则需要至少 8 * M * N字节的内存。