Повторяющийся "PermGen" в Tomcat 6
Я продолжаю получать ошибку "PermGen" на моем сервере Tomcat 6.
Я знаю, какое приложение вызывает проблему, но я не уверен, почему это так. Приложение использует MySQL 5 и работает на JDK 6.
Существуют ли какие-либо инструменты/предложения для диагностики или анализа основных проблем с конкретным приложением?
Спасибо
Ответы
Ответ 1
PermGen используется для хранения определений классов и интернированного пула строк. Ваш код мог бы заполнить его (если он вызывает неуспешно), но более вероятно, что значение по умолчанию для вашего приложения мало.
Это связано с тем, что Tomcat будет загружать новые классы при каждом развертывании WAR - или, если вы работаете в среде разработки, каждый раз, когда вы редактируете JSP. В конечном итоге их следует очистить, но в активной среде разработки могут быть периоды, в которых загружены как старые, так и новые экземпляры. Или, если вы находитесь в производственной среде и имеете большое веб-приложение, вам может потребоваться больше места.
Чтобы установить размер перменца, используйте -XX:MaxPermSize=SIZE
Следующие ссылки могут быть полезны: настройка GC (это версия 1.5), FAQ GC (версия 1.4.2), Параметры виртуальной машины Hotspot (я считаю, что это 1.6)
Ответ 2
Попробуйте использовать следующие JVM-переключатели:
-XX:+UseConcMarkSweepGC
-XX:+CMSPermGenSweepingEnabled
-XX:+CMSClassUnloadingEnabled
Ускорение пространства перменства с помощью -XX:MaxPermSize
просто задерживает проблему.
Пожалуйста, смотрите этот комментарий:
Как бороться с ошибкой java.lang.OutOfMemoryError: PermGen space
Это косвенно указало мне на эти два сообщения: проблема, решение
Ответ 3
попробуйте следующее: В Linux-машинах
export JAVA_OPTS="-XX:PermSize=128m"
Ответ 4
Я думаю, у вас может быть много JSP в вашем приложении. Известная проблема в tomcat, где перезапуск развернутого приложения со многими JSP вызывает проблемы PermGen, потому что tomcat перекомпилирует и перезагружает все эти классы снова. Увеличение размера, как указано в предыдущем посте, должно помочь.
Ответ 5
Я согласен с тем, что увеличение пространства пермгенов с помощью -XX: MaxPermSize просто задерживает проблему. Я попробовал увеличить permgen, и после этого я начал получать ту же ошибку после того, как отправил на сервер больше запросов.
Предлагаются дополнительные флаги, такие как -XX: + CMSClassUnloadingEnabled, хотя это немного уменьшит производительность.
Ответ 6
Я видел много ошибок пергмена, когда tomcat перезагружается после изменения кода при использовании hibernate и spring, я думаю, что из-за того, что экземпляры logger/ehcache не закрываются должным образом.