【发布时间】:2017-09-09 17:43:55
【问题描述】:
查看同事的代码,发现代码如下
BufferedReader br = new BufferedReader(new FileReader(PATH + fileName));
//...
只是读取一个文件并将这些行连接为一行,但我没有找到任何关闭代码,所以我认为它应该导致资源泄漏,最后导致too many open files error,所以为了证明这一点,我写了一个测试
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?
那怎么了?如何导致too many open files error ?
按照@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)
当我是27436,在这种情况下检查命令行中真正打开的文件是
➜ ~ lsof | grep foo.pem | wc -l
7275
但是剩下的文件在哪里(27346 - 7275)?以及为什么 ulimit number 不起作用?
【问题讨论】:
-
我会使用
while(true)循环开始这样的实验......并且可能会将该计数器打印到每个文件中......并检查磁盘上发生的情况。 -
谢谢!请查看我的其他信息
-
除此之外:您可能忽略了我的建议:我会尝试打开不同的文件以写入,并将不同的内容写入每个文件。除非我的回答完全是虚假的,否则如果您发现您的操作系统能够以某种方式“优化”对同一文件的许多读取请求,我不会感到惊讶。但是将不同的东西写入不同的文件是不能轻易优化的。让我知道结果是什么;-)