Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
超出了GC开销限制。用Java读取文件_Java_Garbage Collection_Readfile - Fatal编程技术网

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

超出了GC开销限制。用Java读取文件,java,garbage-collection,readfile,Java,Garbage Collection,Readfile,我想要一个高效的代码来做这件事 当我运行这段代码时,几分钟后代码运行非常慢,CPU使用率很高 在数据库中读取文件并写入wholeDocument时,几分钟后Java编译器显示错误Java.lang.OutOfMemoryError:超出了GC开销限制 String wholeDocument = ""; try { bufferedReader = new BufferedReader(new FileReader(files)); String line; int co

我想要一个高效的代码来做这件事

当我运行这段代码时,几分钟后代码运行非常慢,CPU使用率很高

在数据库中读取文件并写入
wholeDocument
时,几分钟后Java编译器显示
错误Java.lang.OutOfMemoryError:超出了GC开销限制

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();
    }
}
字符串wholeDocument=”“;
试一试{
bufferedReader=新bufferedReader(新文件读取器(文件));
弦线;
整数计数=0;
而((line=bufferedReader.readLine())!=null){
如果(第行包含(“”)){
wholeDocument=行;
而((line=bufferedReader.readLine())!=null){
wholeDocument=wholeDocument+“\n”+行;
如果(第行包含(“”)){
System.out.println(count++);
wholeDocument=“”;
打破
}
}
}
}
}catch(filenotfounde异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}最后{
试一试{
bufferedReader.close();
}捕获(IOE异常){
e、 printStackTrace();
}
}

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

例:


使用
StringBuilder
。或者,更好的方法是使用XML解析器。是的,正如@SLaks所说,您创建的字符串对象太多了。相反,请使用StringBuilder。如果可能,通过将StringBuilder的长度设置为0来重用StringBuilder。效果良好。但我想把“wholeDocument”保存到数据库中。我从中创建一个类并保存到数据库。我使用Hibernat将对象存储到数据库中。我将其存储在数据库中的代码是:public void addPageToDatabase(Page){session.save(Page);if(counter%3000==0){commit();}counter++;}但在将56400(“wholeDocument”)存储到数据库中之后,我遇到了同样的问题。若我不创建新的Page类来存储到数据库中并使用一个Page对象,comiler就会显示这个错误:“线程中的异常”main“org.hibernate.hibernateeException:数据库实例的标识符从1更改为8751“如何在数据库中存储86000字符串(“wholeDocument”)?
StringBuilder sb = new StringBuilder();
sb.append("New String");