超出了GC开销限制。用Java读取文件

时间:2016-01-11 20:50:44

标签: java garbage-collection readfile

我想要一个有效的代码来做到这一点。

当我运行此代码时,几分钟后代码运行速度非常慢且CPU使用率很高。

读取文件并在数据库中写入wholeDocument时,几分钟后Java编译器显示Error java.lang.OutOfMemoryError: GC overhead limit exceeded

String wholeDocument = "";
try {
    bufferedReader = new BufferedReader(new FileReader(files));
    String line;
    int count = 0;
    while ((line = bufferedReader.readLine()) != null) {
        if (line.contains("<page>")) {
            wholeDocument = line;
            while ((line = bufferedReader.readLine()) != null) {
                wholeDocument = wholeDocument + "\n" + line;
                if (line.contains("</page>")) {
                    System.out.println(count++);
                    wholeDocument = "";
                    break;
                }
            }
        }
    }
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} finally {
    try {
        bufferedReader.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

1 个答案:

答案 0 :(得分:1)

您必须记住,Strings是java中的不可变数据类型。这意味着每次执行String = String + String时,它都会创建一个全新的字符串,并将旧字符串保留在内存中。如果您使用StringBuilder(或StringBuffer来保证线程安全),您可以安全地将新字符串“追加”到现有字符串,而不必担心过度使用内存。

前:

StringBuilder sb = new StringBuilder();
sb.append("New String");