Любые советы по отладке Java для поиска причины "слишком много открытых файлов" - PullRequest
5 голосов
/ 15 сентября 2011

Я занимаюсь разработкой в ​​среде Linux, и система предназначена для непрерывной работы в течение длительного периода времени. После ночного теста мы видим исключение FileNotFoundException с сообщением «Too Many Files Open». Мы начали регистрировать вывод команды lsof в разное время в системе, чтобы увидеть, можем ли мы увидеть, что происходит. Мы заметили много безымянных открытых труб. Поэтому я решил, что это связано с тем, что файловые потоки не закрываются. Я искал в источнике все используемые * Stream-объекты и убедился, что все они закрываются в блоке finally {}. Существуют ли какие-либо другие типы объектов Java, которые я мог бы найти, которые я не мог бы закрыть, что могло бы открыть все эти безымянные каналы?

Кроме того, мой ulimit - 1024, и я также искал * Writer и убедился, что все они тоже закрываются.

Ответы [ 3 ]

2 голосов
/ 15 сентября 2011

YourKit может стоить посмотреть. пробники предназначены для решения подобных проблем, хотя у меня никогда не было возможности попробовать эту функцию самостоятельно.

0 голосов
/ 16 сентября 2011

Другими классами, которые могут пропускать файловые дескрипторы, являются FileChannel и RandomAccessFile - последний, похоже, даже не имеет финализатора, поэтому его утечки могут быть постоянными.

0 голосов
/ 16 сентября 2011

Я предполагаю, что ваш ulimit является выводом ulimit -n.1024 - это довольно небольшое количество файловых дескрипторов, которое необходимо учитывать в производственной системе.На этапе отладки вместо того, чтобы запускать lsof в случайное время и пытаться выполнить корреляцию, почему бы не перехватить исключение FileNotFound и запустить Runtime.exec ("lsof") и распечатать вывод в файл журнала, чтобы получить довольно точное представление о точнокакие файловые дескрипторы использовались при возникновении проблемы.

...