我之前曾问过类似的问题:Java String Memory Leak
但是我不确定要问什么:
这是我编写的另一段代码:
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.InputStreamReader;
public class TestString {
public static int readLineXX(BufferedReader br) throws Exception {
String s = br.readLine();
if ( s == null ) return 0;
return 1;
}
public static void main(String args[]) {
while (true) {
try {
FileInputStream fstream = new FileInputStream("bigfile.txt");
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
while ( readLineXX (br)!= 0) {
//System.out.print(".");
}
br.close();
in.close();
fstream.close();
} catch (Exception e) {
}
}
}
}
由于Java中的String是不可变的,因此
String s
将被垃圾回收。我使用
-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails
选项长时间运行了此代码,它运行良好。这是我的主应用程序的小片段代码,我认为这是泄漏并导致
OOM
的情况。bigfile.txt
在1GB
附近。 最佳答案
是的,s
将被垃圾回收。保持不可变不会阻止其被垃圾回收,而只是防止对其进行修改。
请注意,如果行很大,br.readlLine()
可能会使用大量内存。例如,如果您的文本文件是1gb,没有任何换行符,那么br.readLine()
很有可能会消耗2gb,1gb用于读取的数据,然后1gb用于创建的字符串。