8-puzzle java.lang.OutOfMemoryError:超出GC开销限制

8-puzzle java.lang.OutOfMemoryError:超出GC开销限制,java,garbage-collection,out-of-memory,Java,Garbage Collection,Out Of Memory,当我运行我的8-puzzle程序时,我总是得到“超出GC开销限制”。我曾尝试向JVM添加更多内存,但没有效果 以下是问题所在的方法: public void search() { addToQueue(start, null);// add root while (!queue.isEmpty()) { currState = queue.removeFirst(); if (goal.equals(currState)) {

当我运行我的8-puzzle程序时,我总是得到“超出GC开销限制”。我曾尝试向JVM添加更多内存,但没有效果

以下是问题所在的方法:

    public void search() {
    addToQueue(start, null);// add root
    while (!queue.isEmpty()) {
        currState = queue.removeFirst();


        if (goal.equals(currState)) { 
            solution = true;
            printSolution(currState);
            break;

        } else {
            a = currState.indexOf("0");

            // left
            while (a != 0 && a != 3 && a != 6) {

                String nextState = currState.substring(0, a - 1) + "0"
                        + currState.charAt(a - 1)
                        + currState.substring(a + 1);
                addToQueue(nextState, currState);
                nodes++;
                break;
            }
            // up
            while (a != 0 && a != 1 && a != 2) {

                String nextState = currState.substring(0, a - 3) + "0"
                        + currState.substring(a - 2, a)
                        + currState.charAt(a - 3)
                        + currState.substring(a + 1);
                addToQueue(nextState, currState);
                nodes++;
                break;
            }
            // right
            while (a != 2 && a != 5 && a != 8) {

                String nextState = currState.substring(0, a)
                        + currState.charAt(a + 1) + "0"
                        + currState.substring(a + 2)
                        + currState.substring(a + 1);
                addToQueue(nextState, currState);
                nodes++;
                break;
            }
            // down
            while (a != 6 && a != 7 && a != 8) {

                String nextState = currState.substring(0, a)
                        + currState.substring(a + 3, a + 4)
                        + currState.substring(a + 1, a + 3) + "0"
                        + currState.substring(a + 4);
                addToQueue(nextState, currState);
                nodes++;
                break;
            }

        }

    }

}
Start是我从.txt文件中读取的字符串。 它可以解决一些问题,但有些问题会产生这种错误

    private void addToQueue(String newState, String oldState) {
    if (!levelDepth.containsKey(newState)) {
        newValue = oldState == null ? 0 : levelDepth.get(oldState) + 1;
        unique++;
        levelDepth.put(newState, newValue);
        queue.add(newState);
        stateHistory.put(newState, oldState);

    }

}

您得到的错误是由于GC线程占用了98%或更多的处理器时间

最简单的方法是将方法分解为几个不同的方法,这样可以收集方法的本地字符串

其次,将字符串缓冲区用于连接,字符串连接将大大降低速度


您还可以处理其他事情,如并发GC等,但帮助jre解决方法结构是最重要的

错误消息还有其他内容吗?它是给你一个行号/方法名,还是表示任何对象?我可能会想到一件事:看起来你正在创建大量字符串。您可能希望找到另一种存储状态的方法。我不知道这是否是您的问题的原因,但所有这些字符串连接/重新分配都有点危险。前面评论的免责声明:我从未遇到过此错误,因此我可能会偏离此方向。希望有更多经验的人能提供更多信息。这绝对是个有趣的问题。我很想知道原因。我觉得你的循环结构很奇怪,我不确定你是否需要排队。看起来您要么已经完成了处理(goal.equals(currState)),要么向队列中添加了几个项目(在所有这些while循环中)。您的队列似乎只会不断增长,但您似乎只对队列中的第一项感兴趣。我有一种预感,你有一大堆不需要的数据。而且,你所有的内部while循环都挂起了“a”,但我看不到它的值在那些相同的循环中发生了变化。你确定你不只是有一个无限循环吗?你调试过这个吗?