我在看以下文章:
Increase heap size in Java
现在,我有一个程序需要大约5GB的内存,同时按照文章中的内容进行操作(通过在arguments字段中使用-Xmx5g增加堆大小),我仍然在
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
我的系统是具有8GB RAM的Windows 7(64位)。难道我做错了什么?如果是,我将如何继续获得5GB的堆内存,否则我的系统无法处理?
注意:我必须使用大小为25K * 25K的所有非零值的2D矩阵进行计算。因此,我也不能使用稀疏矩阵。
最佳答案
当JVM没有足够的内存来分配对象时,将抛出OutOfMemoryError
。如果您定义5G
的堆,这几乎肯定意味着您存在某种内存泄漏。例如,我可以编写非常简单的代码,在任何环境下都会导致OutOfMemoryError
:
List<String> list = new LinkedList<>();
while(true) {
list.add("a");
}
运行此代码,然后等待几秒钟。
OutOfMemoryError
将被抛出。这是因为我将字符串添加到列表中,并且从不清理它。我相信您的应用程序也会发生类似的情况。
我知道,它不像我的例子那么简单,因此您可能必须使用事件探查器对其进行调试并了解内存泄漏的原因。
编辑:
我刚刚看到您正在使用25K * 25K矩阵。这意味着您有625M单元。您没有提到矩阵的类型,但是如果
int
占用4个字节,则需要625 * 4 = 2500M = 2.5G内存,因此5G应该足够了。请尝试分析程序中还会发生什么以及您的内存用处。