Java内存泄漏 - FileReaders,BufferedReaders和Stacks

时间:2012-02-22 11:06:31

标签: java memory-management memory-leaks

我不是世界上经验最丰富的Java程序员,我正在尝试创建一个可以提取数据并将其存储起来的工具,但是我有一个内存泄漏(至少我认为这是发生了什么,无论哪种方式我得到一个java.lang.OutOfMemoryError:Java堆空间。)

以下是有问题的代码:

public static void main(String[] args)
{
    File inputDirectory = new File(args[0]);
    File[] files = inputDirectory.listFiles();
    for(int i = 0 ; i < files.length ; ++i)
    {
        DoSomethingWithTheFile(files[i]);
    }
}

public static void DoSomethingWithTheFile(File inputFile) throws VariousExceptions
{
    boolean result = false;
    if(inputFile.exists())
    {
        FileReader fr = new FileReader(inputFile);
        BufferedReader br = new BufferedReader(fr);
        Stack lines = new Stack();
        String line;
        while((line = br.readLine()) != null)
        {
            lines.push(line);
        }
        br.close();
        int numberOfRecords = lines.size();
        for(int i = 0 ; i < numberOfRecords ; ++i)
        {
            String theString = (String)lines.pop();
        }
        result = true;
    }
    return result;
}

我正在读取堆栈,以便在开始处理之前知道文件中的行数,这样我就可以让用户知道文件的存在距离。

显然这是一个玩具示例,而在真实版本中它的功能不止于此,但是我可以使用上面提到的代码版本来复制问题。我目前正在尝试阅读4个文件,第一个文件只有50多万行,第二个只有25万多个。该程序在尝试阅读第三个文件时爆炸。

我做错了什么想法?

谢谢, 瑞克

2 个答案:

答案 0 :(得分:3)

您可以使用-Xmx选项增加分配给程序的最大内存:

java -Xmx256m -jar yourApplication.jar

此外,关闭流的更好方法是使用try / catch / finally。即使抛出异常,也始终运行“finally”语句。它将类似于:

boolean result = false;
if(inputFile.exists())
{
    FileReader fr = null;
    BufferedReader br = null;
    try{
        fr = new FileReader(inputFile);
        br = new BufferedReader(fr);
        Stack lines = new Stack();
        String line;
        while((line = br.readLine()) != null)
        {
            lines.push(line);
        }
        br.close();
        int numberOfRecords = lines.size();
        for(int i = 0 ; i < numberOfRecords ; ++i)
        {
            String theString = (String)lines.pop();
        }
        result = true;
    }
    finally{
        if( br != null ) br.close();
        if( fr != null ) fr.close();
    }
}
return result;

最后,这就是“Stack lines”对象,它保留了大量内存。如果您不想增加内存,请在while(...)循环中执行操作。

答案 1 :(得分:0)

您是否尝试过增加最大堆大小?

java -Xms<initial heap size> -Xmx<maximum heap size>

编辑:噢..已经有了答案