gpt4 book ai didi

Java IOException "Too many open files"错误

转载 作者:太空狗 更新时间:2023-10-29 12:42:32 28 4
gpt4 key购买 nike

我正在对多个文件执行一些文件 I/O(写入 19 个文件,碰巧如此)。在给他们写了几百次之后,我得到了 Java IOException: Too many open files。但我实际上一次只打开了几个文件。这里有什么问题?我可以验证写入是否成功。

最佳答案

在 Linux 和其他 UNIX/类 UNIX 平台上,操作系统对进程在任何给定时间可能拥有的打开文件描述符的数量进行了限制。在过去,这个限制曾经是固定的1,而且相对较小。如今,它要大得多(成百上千),并且受“软”每个进程可配置资源限制的约束。 (查找内置的 ulimit shell ...)

您的 Java 应用程序必须超过每个进程的文件描述符限制。

您说您打开了 19 个文件,并且在几百次之后您得到一个 IOException 说“打开的文件太多”。现在这个特殊的异常只能在请求新的文件描述符时发生;即当您打开一个文件(或管道或套接字)时。您可以通过打印 IOException 的堆栈跟踪来验证这一点。

除非您的应用程序在较小的资源限制下运行(这似乎不太可能),否则它必须反复打开文件/套接字/管道,并且无法关闭它们。找出发生这种情况的原因,您应该能够弄清楚该怎么做。

仅供引用,以下模式是写入保证不会泄漏文件描述符的文件的安全方式。

Writer w = new FileWriter(...);
try {
// write stuff to the file
} finally {
try {
w.close();
} catch (IOException ex) {
// Log error writing file and bail out.
}
}

1 - 硬连线,如编译到内核中。更改可用 fd 插槽的数量需要重新编译……并且可能导致可用于其他事情的内存减少。在 Unix 通常在 16 位机器上运行的时代,这些东西真的很重要。

更新

Java 7 的方式更简洁:

try (Writer w = new FileWriter(...)) {
// write stuff to the file
} // the `w` resource is automatically closed

更新 2

显然,您在尝试运行外部程序时也会遇到“打开的文件太多”的问题。基本原因如上所述。但是,您在 exec(...) 中遇到这种情况的原因是 JVM 正在尝试创建将连接到外部应用程序的标准输入/输出/错误的“管道”文件描述符。

关于Java IOException "Too many open files"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37288047/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com