[英]Memory leakage in Java
该代码应打开一个文本文件,跳过第一行,将其余各行复制到temp变量,清除文件,然后将temp变量重写到文件中。
我怀疑这段代码正在产生内存泄漏,尽管我正在清除并关闭所有对象。 我在这里想念什么吗?
这段代码每秒被调用30次以上。
Scanner scanner_live = new Scanner(file_live);
ArrayList<String> coll = new ArrayList<String>();
scanner_live.nextLine();
while (scanner_live.hasNextLine())
{
String line = scanner_live.nextLine();
coll.add(line);}
scanner_live.close();
PrintWriter writer_del = new PrintWriter(file_live);
writer_del.print("");
writer_del.close();
for (String line : coll) {
FileWriter writer = new FileWriter(file_live.getAbsoluteFile(),true);
BufferedWriter bufferedWriter = new BufferedWriter(writer);
bufferedWriter.append(line);
bufferedWriter.newLine();
bufferedWriter.close();
writer.close();
}
coll.clear();
我建议您避免存储所有行。 相反,您可以在读取数据时将其复制。 实际上,您不需要在第一行之后解析每一行,只需复制其余数据即可。
try(BufferedReader in = new BufferedReader(new FileReader(file_live);
BufferedWriter out = new BufferedWriter(new FileWriter(file_live+".tmp"))) {
// skip the first line
in.readLine();
char[] buffer = new char[8*1024];
for(int len; (len = in.read(buffer)) > 0;)
out.write(buffer, 0, len);
}
new File(file_live).delete();
new File(file_live+".tmp").renameTo(new File(file_live));
顺便说一句:这种方式一次消耗一行非常昂贵,特别是如果文件很大。 如果可以的话,我建议不要完全重写该文件,而应单独记录您要写的那一行。
您的算法,但更正确。
File file = ...
List<String> lines = new ArrayList<>();
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
// skip first
String line = reader.readLine();
while ((line = reader.readLine()) != null) {
lines.add(line);
}
} catch (IOException e) {
e.printStackTrace();
}
try (PrintWriter writer = new PrintWriter(new FileWriter(file))){
for (String line : lines) {
writer.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
另外,如果文件很小,我看不到内存泄漏。 但是,如果文件很大,那是因为您将所有行都保留在内存中。 JVM内存!=您计算机上的所有内存。 因此,JVM可能会超出限制。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.