堆大小增加到6GB

时间:2014-03-27 08:21:09

标签: java heap-memory

我在查看以下文章: 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矩阵进行计算。因此我也不能使用稀疏矩阵。

2 个答案:

答案 0 :(得分:2)

当JVM没有足够的内存来分配对象时,抛出

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字节的内存。