Есть ли способ избежать утечек памяти при развертывании в Tomcat? - PullRequest
54 голосов
/ 30 декабря 2010

Этот вопрос предназначен для всех, кто когда-либо проверял кнопку «Найти утечки» в менеджере Tomcat и получил некоторые результаты, например:

Следующие веб-приложения были остановлены (перезагружены, не развернуты), ноих классы из предыдущих запусков все еще загружаются в память, что вызывает утечку памяти (для подтверждения используйте профилировщик):
/ leaky-app-name

Я предполагаю, что это что-тосделайте с этой ошибкой «Perm Gen space», которую вы часто получаете при частых перераспределениях.

Итак, при развертывании jconsole я вижу, что мои загруженные классы переходят от 2k до 5k.Тогда вы могли бы подумать, что при развертывании их нужно уменьшить до 2 тыс., Но они останутся на 5 тыс.

Я также пытался использовать следующие параметры JVM:

-XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC -XX:+CMSPermGenSweepingEnabled

Я видел ОЧЕНЬ незначительные провалы в объеме используемого пространства Perm Gen, но не то, что ожидал, и число загруженных классов не уменьшилось.

Так есть ли способ настроить Tomcat или спроектировать ваше приложение для лучшей выгрузкина безработице?Или мы застряли с перезапуском сервера после нескольких основных сеансов отладки?

Вывод версии Tomcat:

Версия сервера: Apache Tomcat / 6.0.29
Построение сервера: 19 июля2010 1458
Номер сервера: 6.0.0.29
Имя ОС: Windows 7
Версия ОС: 6.1
Архитектура: x86
Версия JVM: 1.6.0_18-b07
Поставщик JVM: SunMicrosystems Inc.

Обновление:

Благодаря ответу Селиас я решил еще немного покопаться и, думаю, определил виновникабыть в моем приложении благодаря CXF, Spring и JAXB.

После того, как я узнал, как профилировать приложение Java, я указал профилировщику на Tomcat и сделал несколько дампов и снимков кучи, чтобы увидеть, как выглядят объекты и классы.в памяти.Я обнаружил, что некоторые перечисления из моей схемы XML, используемые в моих сгенерированных классах CXF / JAXB (wsdl2java), задерживаются после отмены развертывания.Согласно моей свалке, объекты выглядят так, как будто они привязаны к карте.Отказ от ответственности: я признаю, что я все еще немного зеленоват с профилированием и отслеживанием дерева вызовов объекта может быть сложной задачей в Java.

Также я должен отметить, что я даже не вызывал службу, просто развернул ее, а затем развернул ее,Сами объекты оказались загруженными с помощью отражения, инициированного Spring при развертывании.Я полагаю, что я следовал соглашению для настройки сервиса CXF весной.Поэтому я не уверен на 100%, является ли это ошибкой Spring / CXF, JAXB или рефлексии.

В качестве примечания: рассматриваемое приложение представляет собой веб-сервис, использующий Spring / CXF, и XML оказываетсядовольно сложная схема (расширение NIEM ).

Ответы [ 2 ]

15 голосов
/ 30 декабря 2010

Если вы хотите быть уверенным, что утечки не возникнут, вы должны сделать следующее:

  • Убедитесь, что ваше веб-приложение не использует классы java, которые есть в общих библиотеках веб-контейнера. Если у вас есть общие библиотеки, убедитесь, что в этих библиотеках нет сильных ссылок на объекты
  • Избегайте использования статических переменных, особенно для объектов Java, таких как HashTable, Sets и т. Д. Если вам нужно, убедитесь, что вы вызываете remove, чтобы освободить объекты с картами, списками ...

Вот также хорошая статья о ThreadLocal и MemoryLeaks - http://blog.arendsen.net/index.php/2005/02/22/threadlocals-and-memory-leaks-revisited/

6 голосов
/ 30 декабря 2010

Tomcat 7 должен принести улучшения в этой области.См. Особенности Apache Tomcat 7 , раздел под названием Больше никаких утечек!

Они считают, что теперь они могут справиться с большим количеством утечек памяти, вызванных веб-приложениями.К сожалению, он все еще находится в бета-версии.

Кроме этого, я могу просто сказать, что я сделал то же самое и не нашел решения.Развертывание обычно требует перезагрузки Tomcat после этого.Я понятия не имею, кто виноват: мое веб-приложение, Tomcat, Hibernate, Tapestry или несколько из них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...