Tomcat на производственном сервере, перспективах и передислоении

StackOverflow https://stackoverflow.com/questions/3521251

Вопрос

Это выглядит как

 MemoryError: PermGen space
 java.lang.OutOfMemoryError: PermGen space

это общая проблема. Вы можете увеличить размер вашего пермского пространства, но после 100 или 200 перераспределений он будет полон. Отслеживание классовых утечек памяти памяти почти невозможно.

Каковы ваши методы Tomcat (или другой простой сервлетный контейнер - пристань?) На производственном сервере? Перезапуск сервера после каждого развертывания решения?

Вы используете один Tomcat для многих приложений?

Может быть, я должен использовать много мочевых серверов на разных портах (или встроенных пристани) и сделать развертывающую / перезапустить / развертывать каждый раз?

Это было полезно?

Решение

Я отказался от использования Tomcat Manager и теперь всегда выключите Tomcat для перераспределения.

Мы запускаем два Tomcats на одном и том же сервере и используем Webacherver Apache с MOD_PROXY_AJP, чтобы пользователи могли получить доступ к обеим приложениям через один и тот же порт 80. Это приятно, потому что пользователи видят на страницу службы Apache, когда Tomcat не работает.

Другие советы

Вы можете попробовать добавить эти параметры Java:

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled

Это позволяет сбора мусора в Permgen Space (по умолчанию по умолчанию) и позволяет GC разгрузить классы. Кроме того, вы должны использовать -xx: permsize = 64m -xx: maxpermsize = 128m, упомянутые в другом месте, чтобы увеличить количество доступных Permgen.

Да действительно, это проблема. Мы запускаем три веб-приложения на сервере Tomcat: № 1 использует Framework Web Application, Hibernate и многие другие банки, нет. 2 использует гибернацию и несколько банок и нет. 3 в основном очень простое приложение JSP.

Когда мы развертываем нет. 1, мы всегда перезапускаем Tomcat. В противном случае ошибка пространства Prengen вскоре укусит нас. № 2 иногда можно развернуть без проблем, но так часто меняется, когда нет. 1 Так же, перезапуск запланирован в любом случае. № 3 не имеет проблем вообще и может быть развернута так часто, как это необходимо без проблем.

Итак, да, мы обычно перезапускаем Tomcat. Но мы также с нетерпением ждем Tomcat 7, который должен справиться с множеством проблем с памятью / классом, которые берутся в разные сторонние банки и рамки.

Переключатели Permgen в точке доступа только задерживают проблему, и в конце концов вы получите OutoFMemoryError в любом случае.

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

JRockit предназначен для интеграции в OpenJDK, поэтому, возможно, эта проблема уйдет на акции Java тоже в будущем.

http://www.orcle.com/technetwork/middleware/jrockit/overview/index.html.

И это бесплатно, по той же лицензии, что и горячая точка:

https://blogs.orcle.com/henrik/entry/jrockit_is_now_free_and.

Вы должны включить сбор мусора Permgen. По умолчанию VM VM VM не собирает мусор Premgen, что означает, что все загруженные файлы классов остаются в памяти навсегда. Каждое новое развертывание загружает новый набор файлов классов, что означает, что вам в конечном итоге выберется из пробела Permgen.

Какую версию Tomcat вы используете? Tomcat 7 и 6.0.30 имеют много функций, чтобы избежать этих утечек, или, по крайней мере, предупредить вас о своей причине.

Эта презентация Марк Томас Спрингсорс (и давний коммиттер Tomcat) на эту тему очень интересно.

Справка, есть новая версия Панцирь Инструмент, который может контролировать и обнаруживать утечки постоянного поколения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top