【发布时间】:2011-08-29 15:39:48
【问题描述】:
我不是 java 专家。
我的代码正在将文件读入String。此代码每 5 分钟执行一次。
文件大小不同。有时是 100 有时是 1000 行。
几天后,我经历了内存不足。
我的问题是,当我的代码超出Reading file function 的范围时,Java 垃圾会收集字符串吗?
我对在互联网上阅读感到很困惑。有人说它不会被删除并使用StringBuffer。
// Demonstrate FileReader.
import java.io.*;
class FileReaderDemo {
public static void read(BufferedReader br) throws Exception {
long length = 0;
String s;
while (true) {
s = br.readLine();
s += "abcd";
if (s == null) {
break;
}
length += s.length();
//System.out.println(s);
}
System.out.println("Read: " + (length / 1024 / 1024) + " MB");
}
public static void main(String args[]) throws Exception {
//FileReader fr = new FileReader("FileReaderDemo.java");
FileReader fr = new FileReader("big_file.txt.1");
BufferedReader br = new BufferedReader(fr);
String s;
read(br);
fr = new FileReader("big_file.txt.1");
br = new BufferedReader(fr);
read(br);
fr = new FileReader("big_file.txt.1");
br = new BufferedReader(fr);
read(br);
fr = new FileReader("big_file.txt.1");
br = new BufferedReader(fr);
read(br);
BufferedReader in = new BufferedReader(new InputStreamReader(System. in )); in .readLine();
fr.close();
}
}
【问题讨论】:
-
视情况而定。字符串是对象。对于对象,这取决于对象是否被任何东西引用(例如方法的返回值)。可以发一些代码吗?
-
很高兴看到代码,以及你对读入的字符串做了什么。试着给我们一些SSCCE
-
我看不出你发布的代码可以运行几天。
-
变量
s在他检查它的地方永远不会为空,因为他向它添加了“abcd”。我以为它会抛出异常,但显然它变成了“nullabcd” -
@Anonymoose:我不明白它怎么不能无限期运行 :)
标签: java memory memory-leaks garbage-collection out-of-memory