Утечка памяти в Java - FileReaders, BufferedReaders и Stacks - PullRequest
1 голос
/ 22 февраля 2012

Я не самый опытный 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 файла, первый из которых содержит чуть более полумиллиона строк, а второй - чуть более четверти миллиона.Программа бомбит, пытаясь прочитать третий файл.

Есть идеи, что я делаю неправильно?

Спасибо, Рик

Ответы [ 2 ]

3 голосов
/ 22 февраля 2012

Вы можете увеличить максимальный объем памяти, выделяемый вашей программе, с опцией -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 (...), если не хотите увеличивать память.

0 голосов
/ 22 февраля 2012

Вы пытались увеличить максимальный размер кучи?

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

Отредактировано: Ой .. Там уже ответ

...