Java 字符串内存泄漏 II

标签 java memory-leaks garbage-collection out-of-memory

我之前问过类似的问题: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 选项运行这段代码很长时间,它运行良好。

这是我的主要应用程序的一小段代码,我认为它存在泄漏并导致 OOMbigfile.txt 大约 1GB

最佳答案

是的,s 将被垃圾收集。不可变不会阻止它被垃圾收集,它只是阻止它被修改。

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

关于Java 字符串内存泄漏 II,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6077621/

相关文章:

java - 将 MySQL 连接器 JAR 放在我的 WAR 的 WEB-INF/lib 中而不是在 $CATALINA_HOME/common/lib 中?

java - 寻找 driver.scrollTo ("Views"的解决方案)

java - 在 AWS、Azure 之间切换。设计模式

Android Maps V2 内存泄漏三星设备

memory-leaks - matplotlib imshow 中的内存泄漏

java - ThreadLocal 垃圾回收

java - 为什么 JVM 消耗的内存比指定的 -Xms 少?

Java 在特定点分割字符串

c++ - 使用 C++ 字符串可能发生内存泄漏

python gc.collect() 在循环中