java - 释放 java 文件句柄

标签 java file io handle gridgain

我们有一个用 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 并询问它的文件句柄分配?

最佳答案

不能依赖终结器来调用。这不是资源管理的好方法。 Java 中的标准构造是:

InputStream in = null;
try {
  in = ...;
  // do stuff
} catch (IOException e) {
  // error
} finally {
  if (in != null) { try { in.close(); } catch (Exception e) { } }
  in = null;
}

您可能希望将这些句柄包装在一个类中,但这不是一种可靠的方法。

关于java - 释放 java 文件句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1604935/

相关文章:

java - 如何自动添加 XML 注释

java - ANDROID:从2个不同的 Activity (不同的 Intent )启动相同的 Activity

Ruby 2.3 编写 UTF-16LE gzip 文件

ios - 使用 Alamofire 从 url 下载后确定文件类型

ruby - Watir 文件上传窗口阻止进一步重定向

java - LWJGL - 调用了当前上下文中不可用的函数

java - FileOutStream.write(byte[]) 总是阻塞吗?

linux - 从 Groovy 将 telnet 作为 shell 命令调用

java - 为什么Socket Server关闭后,TCP接收方还能接收到数据?

java - 为什么 jSTL 不工作?