ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-07-03 13:48:59  阅读:150  来源: 互联网

标签:java out-of-memory garbage-collection


当我运行我的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读入的String.
它可以解决一些问题,但有些会产生这个错误.

    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%或更多的处理器时间.

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

其次使用StringBuffers进行连接,字符串连接将大大减慢速度.

还有其他你可以解决的问题,并发GC等,但帮助你的方法结构是最重要的.

标签:java,out-of-memory,garbage-collection
来源: https://codeday.me/bug/20190703/1367136.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有