我看了下面这篇文章:Increase heap size in Java
现在,我有一个需要大约5 5GB内存的程序,在执行本文中所述的操作时(即通过在参数字段中使用-Xmx5g来增加堆大小),我仍然可以
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space我的系统是Windows 7 (64位),内存为8 8GB。我做错了什么吗?如果是,我应该如何获得5 5GB的堆内存,或者我的系统根本无法处理?
注意:我必须使用一个大小为25K*25K且所有非零值的2D矩阵进行计算。因此,我也不能使用稀疏矩阵。
发布于 2014-03-27 16:29:37
当JVM没有足够的内存来分配对象时,就会抛出OutOfMemoryError。如果你定义了5G堆,这几乎肯定意味着你有一种内存泄漏。例如,我可以编写在任何环境下都会导致OutOfMemoryError的非常简单的代码:
List<String> list = new LinkedList<>();
while(true) {
list.add("a");
}运行此代码并等待几秒钟。OutOfMemoryError将被抛出。这是因为我将字符串添加到列表中,而从不清理它。
我相信你的应用程序也会发生类似的事情。
我明白,它不像我的例子那么简单,所以你可能不得不使用profiler来调试它,并了解内存泄漏的原因。
编辑:我刚刚看到你正在使用25K*25K矩阵。这意味着你有625M个细胞。您没有提到矩阵的类型,但如果它是占用4字节的int,则需要625*4=2500M=2.5G内存,因此5G应该足够了。
请试着分析你的程序中还发生了什么,以及你的内存被花在了哪里。
发布于 2014-03-27 16:36:38
5G/(25K*25K) ~8字节。
宽宏大量地假设你的程序除了那个矩阵不使用内存,每个矩阵元素不能超过8个字节。
您应该至少计算近似的内存需求,以检查是否有可能在您的硬件上处理这种大小的问题。例如,如果您需要一个MxN大小为double值的2D数组,那么您至少需要8*M*N字节的内存。
https://stackoverflow.com/questions/22681831
复制相似问题