Вот несколько советов по отладке ситуации Too Many Open Files. Две команды Unix, которые могут быть полезны: ulimit
и lsof
Я предлагаю вам man ulimit
сначала понять, что вы можете изменить максимальное количество открытых файлов для процесса. Просто набрав ulimit
в командной строке, вы получите значение по умолчанию для ulimit. Например, для меня:
$ ulimit
unlimited
Я работаю на ванильном дистрибутиве Ubuntu 11.04, так что, похоже, значение по умолчанию - неограниченное. На большинстве моих производственных ящиков значение по умолчанию - 1024.
Далее lsof -p <pid>
, в котором перечислены все открытые файлы для процесса с идентификатором .
Возможно, вы обнаружите, что вы либо не закрываете файлы, когда думали, что это так, либо просто открываете слишком много файлов (в зависимости от установленного лимита ulimit)?
Следующим шагом вы запускаете процесс Java, чтобы вы могли получить дамп потока вашего процесса, когда происходит ситуация Too Many Open Files. Чтобы получить дамп потока, отправьте процессу kill -3 <pid>
или, если вы запустили процесс Java в текущей оболочке, вы можете нажать CTRL-Break, чтобы получить дамп потока. Особенно полезно собрать 3 или более дампов потоков, скажем, минуту или две, и из этой коллекции дампов потоков, поэтому стоит взглянуть на потоки, которые существуют в дампах потоков.
Если вам ничего не помогает, поищите «слишком много открытых файлов». Я нашел и нашел эту ссылку, на которую может помочь принятый ответ
Слишком много открытых файлов в Java