我之前曾问过类似的问题: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.txt1GB附近。

最佳答案

是的,s将被垃圾回收。保持不可变不会阻止其被垃圾回收,而只是防止对其进行修改。

请注意,如果行很大,br.readlLine()可能会使用大量内存。例如,如果您的文本文件是1gb,没有任何换行符,那么br.readLine()很有可能会消耗2gb,1gb用于读取的数据,然后1gb用于创建的字符串。

07-24 13:29