При просмотре кода коллеги, найденного ниже кода
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 номер не работает?
while(true)
... и, может быть, распечатать этот счетчик в каждый файл... а также проверить, что происходит на диске. - person GhostCat   schedule 13.04.2017