2 Stimmen

Java-Datei-Handles freigeben

Wir haben eine ziemlich große und komplexe Anwendung in Java geschrieben, die auf dem Gridgain-Paket läuft. Das Problem, das ich habe, ist, dass diese Anwendung etwa einen Tag lang Anfragen verarbeitet, bevor jede Anfrage zu einer Ausnahme vom Typ java.nio.channels.ClosedByInterruptException führt.

Ich vermute, dass die Anwendung die Datei-Handles nicht freigibt und nach einem Tag kontinuierlicher Nutzung nicht mehr in der Lage ist, weitere Anfragen zu bearbeiten (jede Anfrage erfordert das Lesen mehrerer Dateien von jedem Grid-Knoten). Wir haben die meisten unserer Datei-IO-Operationen in Klassen wie der folgenden verpackt

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);
        }
    }
}

Ich denke, das Problem ist, dass dieses Design nicht explizit die Datei-Handle freigeben, meine vorgeschlagene Lösung ist eine finalize-Methode wie diese hinzufügen

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

die dies explizit tun wird. Die Frage ist schließlich, ob dies irgendeine Auswirkung haben wird oder nicht. Haben Klassen wie java.io.BufferedReader bereits einen Mechanismus für den Umgang mit dieser Art von Problem?

EDIT: Auch sehr geschätzt würde hier Möglichkeiten der Überprüfung, ob dies tatsächlich das Problem ist... dh gibt es eine Möglichkeit, eine laufende JVM abzufragen und fragen Sie nach es Datei-Handle-Zuweisungen?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X