【问题标题】:java.lang.OutOfMemoryError: Java heap space for java 8java.lang.OutOfMemoryError:Java 8 的 Java 堆空间
【发布时间】:2015-07-07 17:21:41
【问题描述】:

当我收到此错误时,我使用的是 Java 8(在 Eclipse 中):

java.lang.OutOfMemoryError: Java heap space

我已经尝试过-Xmx 命令,但即使更改 MetaspaceSize 也无法解决问题。当我尝试交换列表的元素时会出现此问题(它的大小

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);
        }
}

【问题讨论】:

  • 你想做什么?你为什么叫克隆?
  • 旁注:我强烈建议您在分支结构中使用大括号,即使只有一个语句。
  • @JaredBurrows 我相信这里的列表只是为了跟踪步骤,因此需要克隆以保持每个步骤的数组状态不变。我可能是错的,虽然我还没有正确阅读。
  • @StuPointerException 因为它是一种纯粹的命令式方法,不会改变或使用封闭对象的任何状态,我真的相信根本没有理由重写它(鉴于函数的性质)。话虽如此,静态让下一个程序员一眼就知道该方法不会改变/使用任何状态,并且还可以改进代码的静态分析。

标签: java recursion out-of-memory java-8


【解决方案1】:

更改分配的堆空间量不会解决问题。

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 2015-05-14
      相关资源
      最近更新 更多