Java错误:打开的文件太多

Ram*_*min -3 java

我编写了一个java代码,它是一个用于组合3种不同软件的包装器.我正常运行代码100,000次.在每次运行时,应该打开,重写和关闭不同的文件,其中所有文件都以正确的try和catch惯例发生.如果我在Linux服务器上运行代码,那就没问题了.但是,当我在1000的10s之后在我的mac上运行它时,出现太多打开文件的错误,并且随后在加载文件X和Y时出错,等等,程序终止.

还有一件事我想添加:代码运行1000次,然后设置被更改并再次运行1000次并重复此过程.因此,对于前4-5次,没有问题,而在6-7次(意味着6000次运行)之后会发生此错误.

Ste*_*n C 5

最可能的解释是,您的Java应用程序中存在导致文件打开文件泄露的错误.避免此问题的方法是编写代码,以便始终关闭文件句柄; 例如

    // Using the 'try with resource' construct
    try (Reader r = new FileReader(...)) {
        // use the reader
    } catch (IOException ex) {
        // ...
    }
Run Code Online (Sandbox Code Playgroud)

要么

    // Using classic try/catch/finally
    Reader r = null;
    try {
        r = new FileReader(...);
        // use the reader
    } catch (IOException ex) {
        // ...
    } finally {
        if (r != null) {
            try {
                r.close();
            } catch (IOException ex) {
                // ignore
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

可能是程序在一个操作系统而不是另一个操作系统上工作,因为在两个系统上打开文件数量的限制是不同的.如果Java GC运行,它将关闭它通过相应句柄的终结器找到的任何无法访问的文件句柄.但是,这可能不会及时发生,以防止"太多文件打开"异常.


如果您的应用程序实际上需要同时打开大量文件,则需要提升限制.ulimit假设您使用的是基于UNIX的操作系统,最好使用内置的shell 完成.

但请注意,仍然存在不可能超过的硬限制.我相信这也适用于Windows.