我之前问过类似的问题: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 s
是否会被垃圾回收。
我使用 -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails
选项运行这段代码很长时间,它运行良好。
这是我的主要应用程序的一小段代码,我认为它存在泄漏并导致 OOM
。
bigfile.txt
大约 1GB
。
最佳答案
是的,s
将被垃圾收集。不可变不会阻止它被垃圾收集,它只是阻止它被修改。
请注意,如果行非常大,br.readlLine()
可能会使用大量内存。例如,如果您的文本文件是 1gb,没有任何换行符,那么 br.readLine()
很有可能会消耗 2gb,其中 1gb 用于读取的数据,然后 1gb 用于读取的数据创建的字符串。
关于Java 字符串内存泄漏 II,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6077621/