Слишком много открытых файлов: сколько открыто, что они, и сколько может JVM открываться

Я получаю это исключение в Java:

java.io.FileNotFoundException: (Too many open files) 

Я ищу способы устранить эту проблему.

Эта ошибка, очевидно, указывает, что JVM выделила слишком много дескрипторов, и базовая ОС не позволит ей иметь больше. Любой у меня есть утечка где-нибудь с неправильно закрытыми соединениями/потоками.

Этот процесс выполнения в течение многих дней без остановок и в конечном счете выдает исключение. Это неоднократно происходит после 12-14 дней времени работы.

Как Вы боретесь с этим? Существует ли способ получить список выделенных дескрипторов в JVM или дорожке, когда это поражает определенную сумму? Я хотел бы иметь их распечатанный и видеть, как это растет и когда. Я не могу использовать профилировщика, потому что это - производственная система, и испытайте затруднения для репродуцирования его в разработке. Какое-либо предложение?

Я контролирую бесплатный размер "кучи" и поднимаю "тревогу", когда он приближается к 1% общего количества, указанного в-Xmx. Я также знаю что, если мое количество потока совершает нападки выше 500, то что-то определенно выходит из-под контроля. Теперь, есть ли способ знать, что моя JVM выделяет слишком много дескрипторов от ОС и не отдает их, например, сокеты, открытые файлы, и т.д. Если бы я был бы, знал, что, я знал бы, где посмотреть и когда.

62
задан Eric Leschinski 15 March 2015 в 19:57
поделиться

2 ответа

IE 8 будет притворяться IE 7 по причинам обратной совместимости - это называется представлением совместимости.

Дополнительные сведения: http ://msdn.microsoft.com/en-us/library/dd567845% 28VS.85% 29 .aspx

Представление совместимости (и, следовательно, строка IE 7 user-agent) включено только для определенных веб-сайтов. Чтобы просмотреть список, посетите

res ://iecompat.dll/iecompatdata.xml

С помощью браузера IE.

-121--4667565-

Поскольку вы находитесь в Linux, я бы предложил вам проверить/proc-Filesystem. Внутри proc вы найдете папку с PID процесса, содержащую папку с именем fd. Если ваш идентификатор процесса 1234, путь будет

/proc/1234/fd

Внутри этой папки, вы найдете ссылки на все открытые файлы (сделать 'ls -l'). Обычно по имени файла можно определить, какую библиотеку/код можно открыть, а не закрыть.

24
ответ дан 24 November 2019 в 16:52
поделиться

Как насчет использования только потоков вместо всего процесса? Например,

  • Можно создать фоновый рабочий поток и предоставить ему несколько нагрузок.
  • Затем в потоке основного теста подождите случайное число миллисекунд. Тогда убей нить.
  • Тогда, возможно, вы захотите снова подождать, чтобы сохранить кэшированные данные (или нет, в зависимости от того, что вы тестируете)
  • Затем запустите свой здравомыслие. Если он бросает, тест провалится здесь, как вам нужно!
  • Здесь вы закончили.

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

-121--4518477-

Вы не сказали, на какой ОС вы работаете, но если вы работаете в Linux, вы можете использовать команду lsof

lsof -p <pid of jvm>

Это будет список всех файлов, открытых JVM. Если вы работаете в Windows, вы можете Проводник процессов , который покажет все открытые файлы для всех процессов.

Мы надеемся, что это позволит вам сузить, какой бит кода сохраняет файлы открытыми.

29
ответ дан 24 November 2019 в 16:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: