gpt4 book ai didi

Java IOException "Too many open files"

转载 作者:IT老高 更新时间:2023-10-28 20:41:30 26 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/4289447/

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