我们有一个用 Java 编写的相当大而复杂的应用程序,它运行在 Gridgain 包之上。我遇到的问题是,在每个请求开始之前,此应用程序将在那里处理请求大约一天,从而导致 java.nio.channels.ClosedByInterruptException 类型的异常。
我的假设是应用程序没有释放文件句柄,并且在连续使用一天后它耗尽并且不能再继续处理请求(每个请求都需要从每个网格节点读取多个文件)。我们已经将大部分文件 IO 操作包装在诸如此类的类中
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);
}
}
}
我认为问题在于这种设计没有明确释放文件句柄,我提出的解决方案是添加这样的 finalize 方法
protected void finalize() throws Throwable
{
reader.close();
super.finalize();
}
这将明确地做到这一点。问题(最后)是这是否可能产生任何影响。诸如 java.io.BufferedReader 之类的类是否已经具有处理此类问题的某种机制?
编辑:这里也非常感谢检查这是否真的是问题的方法......即有没有办法查询正在运行的JVM并询问它的文件句柄分配?