Uwalnianie uchwytów plików java

Mamy dość dużą i złożoną aplikację napisaną w Javie, która działa na pakiecie Gridgain. Problem polega na tym, że ta aplikacja będzie siedzieć tam, przetwarzając żądania przez około dzień, zanim każde żądanie zacznie powodować wyjątek typu java.nio.channels.ClosedByInterruptException.

Moim przypuszczeniem jest, że aplikacja nie zwalnia uchwytów plików i po dniu ciągłego użytkowania kończy się i nie może kontynuować przetwarzania żądań (każde żądanie wymaga odczytu wielu plików z każdego węzła siatki). Większość naszych operacji IO plików zawinęliśmy w klasy takie jak ta

package com.vlc.edge;

import com.vlc.common.VlcRuntimeException;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public final class BufferedReaderImpl implements BufferedReader {
    private java.io.BufferedReader reader;

    public BufferedReaderImpl(final String source) {
        this(new File(source));
    }

    public BufferedReaderImpl(final File source) {
        try {
            reader = new java.io.BufferedReader(new FileReader(source));
        } catch (FileNotFoundException e) {
            throw new VlcRuntimeException(e);
        }
    }

    public BufferedReaderImpl(final Reader reader) {
        this.reader = new java.io.BufferedReader(reader);
    }

    public String readLine() {
        try {
            return reader.readLine();
        } catch (IOException e) {
            throw new VlcRuntimeException(e);
        }
    }

    public void close() {
        try {
            reader.close();
        } catch (IOException e) {
            throw new VlcRuntimeException(e);
        }
    }
}

Myślę, że problem polega na tym, że ten projekt nie zwalnia jawnie uchwytu pliku, moim proponowanym rozwiązaniem jest dodanie takiej metody finalizacji

    protected void finalize() throws Throwable
    {
        reader.close();
        super.finalize();   
    }

co zrobi to wyraźnie. Pytanie (ostatecznie) dotyczy tego, czy może to mieć jakikolwiek skutek. Czy klasy takie jak java.io.BufferedReader mają już jakiś mechanizm radzenia sobie z tego typu problemem?

EDYCJA: Również bardzo mile widziane tutaj byłyby sposoby sprawdzania, czy jest to rzeczywiście problem ... tj. Czy istnieje sposób na zapytanie o działającą JVM i zapytać o jej alokacje uchwytów plików?

questionAnswers(3)

yourAnswerToTheQuestion