【发布时间】:2015-10-24 09:50:49
【问题描述】:
我有一种方法可以读取和解析一个极长的 xml 文件。 xml 文件被读入一个字符串,然后由不同的类解析。但是,这会导致 Java 使用大量内存(~500 MB)。 通常,程序运行在 30 MB 左右,但是当调用 parse() 时,它会增加到 500 MB。但是,当 parse() 运行完毕后,内存使用量不会降到 30 MB;相反,它保持在 500 MB。
我已尝试设置 s = null 并调用 System.gc(),但内存使用量仍保持在 500 MB。
public void parse(){
try {
System.out.println("parsing data...");
String path = dir + "/data.xml";
InputStream i = new FileInputStream(path);
BufferedReader reader = new BufferedReader(new InputStreamReader(i));
String line;
String s = "";
while ((line = reader.readLine()) != null){
s += line + "\n";
}
... parse ...
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
有什么想法吗?
谢谢。
【问题讨论】:
-
不要连接字符串。请改用
StringBuilder, -
那个“... parse ...”为其他内存使用留下了很多空间。你确定字符串 s 是你的问题吗?
-
@DonRoby 是的,我确定,因为我删除了其他所有内容,但问题仍然存在。另外,我已经评论了循环,问题就消失了。
-
@PM77-1 谢谢,帮助很大。内存使用量下降到大约 90 MB。虽然完成后它不会返回到 30 MB,但只要我不调用 parse() 100 次,我应该没问题!
-
@JasonYang:内存使用量下降,因为它现在创建的字符串实例更少。但是,除非您关闭流,否则存在内存泄漏。
标签: java memory memory-management memory-leaks garbage-collection