当我得到这个错误时,我使用Java 8(在Eclipse中):
java.lang.OutOfMemoryError: Java heap space我已经尝试过-Xmx命令,但是即使更改MetaspaceSize也无法解决它。当我试图交换list的元素(它是size<= 395)时,就会出现这个问题。
public void permutation(double[] arr, int pos, ArrayList<double[]> list) {
if (arr.length - pos == 1)
list.add(arr.clone());
else
for (int i = pos; i < arr.length; i++) {
swap(arr, pos, i);
permutation(arr, pos + 1, list);
swap(arr, pos, i);
}
}发布于 2015-04-29 11:12:10
而不是构建每一个可能的组合的列表将使用大量的内存,当探索组合时,结果的数量可以随您输入的元素的数量呈指数增长。
一个简单的方法,它提供了一个调用,以处理每一个组合的发生。这将使工作量保持不变,但内存消耗从O(x^n)下降到O(1)。
public void permutation(double[] arr, int pos, Consumer<double[]> consumer) {
if (arr.length - pos == 1)
consumer.accept(arr);
else
for (int i = pos; i < arr.length; i++) {
swap(arr, pos, i);
permutation(arr, pos + 1, list);
swap(arr, pos, i);
}
}注意:您可以创建一个将克隆添加到列表中的使用者,但也可以打印或处理结果。
发布于 2015-04-28 18:08:44
改变您正在分配的堆空间的数量不会解决这个问题。
您的堆正被消耗殆尽,因为您正在创建数量惊人的对象,并查看您想要实现的目标,这很可能是代码中的一个错误。
您需要调试应用程序,以确定在何处创建了所有对象,以及垃圾收集器为什么不能清除它们。
https://stackoverflow.com/questions/29926528
复制相似问题