Я получаю это исключение в Java:
java.io.FileNotFoundException: (Too many open files)
Я ищу способы устранить эту проблему.
Эта ошибка, очевидно, указывает, что JVM выделила слишком много дескрипторов, и базовая ОС не позволит ей иметь больше. Любой у меня есть утечка где-нибудь с неправильно закрытыми соединениями/потоками.
Этот процесс выполнения в течение многих дней без остановок и в конечном счете выдает исключение. Это неоднократно происходит после 12-14 дней времени работы.
Как Вы боретесь с этим? Существует ли способ получить список выделенных дескрипторов в JVM или дорожке, когда это поражает определенную сумму? Я хотел бы иметь их распечатанный и видеть, как это растет и когда. Я не могу использовать профилировщика, потому что это - производственная система, и испытайте затруднения для репродуцирования его в разработке. Какое-либо предложение?
Я контролирую бесплатный размер "кучи" и поднимаю "тревогу", когда он приближается к 1% общего количества, указанного в-Xmx. Я также знаю что, если мое количество потока совершает нападки выше 500, то что-то определенно выходит из-под контроля. Теперь, есть ли способ знать, что моя JVM выделяет слишком много дескрипторов от ОС и не отдает их, например, сокеты, открытые файлы, и т.д. Если бы я был бы, знал, что, я знал бы, где посмотреть и когда.
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'). Обычно по имени файла можно определить, какую библиотеку/код можно открыть, а не закрыть.
Как насчет использования только потоков вместо всего процесса? Например,
Я бы предпочел назвать вышеприведенный тест интеграционным тестом. В любом случае, это сделает то, что вам нужно. Запуск будет выполняться несколько раз для проверки различных случаев повреждения данных в каждом запуске.
-121--4518477-Вы не сказали, на какой ОС вы работаете, но если вы работаете в Linux, вы можете использовать команду lsof
lsof -p <pid of jvm>
Это будет список всех файлов, открытых JVM. Если вы работаете в Windows, вы можете Проводник процессов , который покажет все открытые файлы для всех процессов.
Мы надеемся, что это позволит вам сузить, какой бит кода сохраняет файлы открытыми.