java.lang.OutOfMemoryError: Java heap space for java 8

java.lang.OutOfMemoryError: Java heap space for java 8

我在遇到此错误时使用 Java 8(在 Eclipse 中):

java.lang.OutOfMemoryError: Java heap space

我试过 -Xmx 命令,但没有用,即使更改 MetaspaceSize 也无法解决问题。当我尝试交换列表元素时出现此问题(它的大小<= 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);
        }
}

更改您正在分配的堆space数量不会解决问题。

您的堆正在被用完,因为您正在创建数量惊人的对象并查看您正在尝试实现的目标,这可能是您的代码中的错误。

您需要调试您的应用程序以确定所有对象的创建位置以及垃圾收集器无法清除它们的原因。

不是构建包含每个可能组合的列表,而是会占用大量内存,并且在探索组合时,结果的数量会随着您输入的元素数量呈指数增长。

解决此问题的一种简单方法是提供回调以在每个组合发生时对其进行处理。这将使工作量大致相同,但内存消耗从 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);
        }
}

注意:您可以创建一个将克隆添加到列表的消费者,但您也可以随时打印或处理结果。