BufferedReader br = new BufferedReader(new FileReader(PATH + fileName));
//...
我想读取一个文件并将这些行连接成一行,但我没有发现任何关闭代码。所以我认为这可能导致资源泄漏,最终导致太多打开的文件错误
。为了证明这一点,我编写了一个测试。
for (int i = 0; i < 7168; i++) { // ulimit -n ==> 7168
BufferedReader br = new BufferedReader(new FileReader("src/main/resources/privateKey/foo.pem"));
System.out.println(br.readLine());
}
System.in.read();
非常奇怪,一切都正常,没有抛出预期的异常。
在命令行中检查实际打开的文件。
➜ ~ lsof -p 16276 | grep 'foo.pem' | wc -l
2538
为什么只有2538,而不是7168?
那么出了什么问题?如何导致“打开的文件太多错误”?
正如 @GhostCat 建议的那样,将7168更改为Integer.MAX_VALUE后,这次引发了
java.io.FileNotFoundException: src/main/resources/privateKey/foo.pem (Too many open files in system)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
当i为
27436
时,在命令行中检查实际打开的文件。➜ ~ lsof | grep foo.pem | wc -l
7275
但是剩下的文件(27346-7275)去哪了?为什么ulimit设置无效呢?
while(true)
循环来开始这样的实验...也许将计数器打印到每个文件中...并检查磁盘上发生了什么。 - GhostCat