2017-01-13 20 views
1

Недавно наш производственный сервер: tomcat6 часто висят и бросает следующую ошибку: «java.lang.OutOfMemoryError: PermGen space», на котором запущен сервер Windows 2003 с 4 ГБ оперативной памяти. 25 работает на этом сервере, похоже, что он был перегружен, но раньше он работал нормально. Я попытался очистить утечки памяти, например, закрыть соединения DB, увеличив память кучи с помощью JAVA_OPTS. Тем не менее я не мог найти точной причины. Также у нашего Tomcat6 не было настроено приложение-менеджер, поэтому я не мог запускать проверки памяти/работоспособности. Пожалуйста, помогите мне решить эту проблему.Tomcat6 часто висит из-за: java.lang.OutOfMemoryError: PermGen space

+1

PermGen чаще всего ассоциируется с определениями классов (и с некоторыми старыми XML парсеров, IIRC). Возможно, вам захочется явно выделить больше пространства PermGen, так как вы используете 25 разных приложений (возможно, каждая из них имеет несколько разные версии различных поддерживающих библиотек). См. Http://stackoverflow.com/questions/3003855/increase-permgen-space – Gus

ответ

1

Вы должны увеличить PermGen пространство редактирования вашего JAVA_OPTS и используя опцию XX: MaxPermSize (например, -XX:MaxPermSize=1024m). Увеличение размера кучи (Xmx) не полезно в вашем случае.

Я также предлагаю использовать инструмент мониторинга (APM), как Glowroot исследовать использование памяти и настроить JAVA_OPTS по мере необходимости.

Для получения дополнительной информации о цели пространства PermGen и механизм его сбора мусора, посмотрите на этот ответ: https://stackoverflow.com/a/5387423/3260495

+1

Спасибо @Robert Hume, но я уже добавил MaxPermSize в JAVA_OPTS со следующим набором: JAVA_OPTS =% JAVA_OPTS% -Xms1024m -Xmx1024m -XX: MaxPermSize = 1024m -XX: + CMSClassUnloadingEnabled -XX: + CMSPermGenSweepingEnabled -server ". Но все еще есть проблема. Есть ли способ отслеживать, выбирает ли экземпляр tomcat этот MaxPermSize или нет? APM будет хорошей идеей, я постараюсь сделать это – Vic

+0

Учитывая, что у вас нет Tomcat Manager, вы можете добавить аргумент '-XX: + PrintCommandLineFlags' в' JAVA_OPTS', перезапустить сервер, а затем проверить 'logs/catalina .out': вы должны увидеть одну строку, содержащую все флаги командной строки, которые вы указали с помощью 'JAVA_OPTS'. –

+1

Спасибо @Robert Hume, даже после добавления аргумента PrintCommandLine в 'JAVA_OPTS' также я не получаю подробностей в журналах. просто мысль, на какое-то время, есть ли способ найти, работает ли Tomcat или нет? Например, пинг с другого сервера и получение оповещения по электронной почте, если tomcat не отвечает (например, монитор содержимого URL), по крайней мере, мы можем получить немедленные действия, пока сервер повесился – Vic