第三方Java库中的文件描述符泄漏

时间:2018-12-24 12:31:45

标签: java file

我正在使用使用RandomAccesFile的第三方库。在其中一个构造函数中,它打开文件(检索描述符),然后尝试读取标头。如果在读取标题时发生异常,则不会关闭在上一步中打开的RandomAccesFile,并且文件描述符将一直保留到GC完成其工作为止。

我不能依靠GC来收集未引用的RandomAccesFile实例来清除文件描述符,因为此问题与内存使用无关。

即使我想自己关闭RandomAccesFile,我也无法访问它,因为打开RandomAccesFile的对象由于其构造函数中的异常而从未创建。

这是库中的两个构造函数:

我正在创建FileObjectQueue实例

public FileObjectQueue(File file, FileObjectQueue.Converter<T> converter) throws IOException {
    this.file = file;
    this.converter = converter;
    this.queueFile = new QueueFile(file);
}

它会创建QueueFile,这会导致泄漏。

final RandomAccessFile raf;

public QueueFile(File file) throws IOException {
    if (!file.exists()) {
        initialize(file);
    }

    this.raf = open(file);
    this.readHeader();
}

如您所见,扩展这些类将无济于事,因为它们是这些类中唯一的构造函数。

我不想使用反射或字节码操作。

感谢您的帮助。

0 个答案:

没有答案