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?