Есть ли способ избежать утечки памяти при неразвертывании в Tomcat?



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




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

/дырявый-приложение-имя




Я предполагаю, что это как-то связано с той ошибкой "Пермского генного пространства", с которой вы часто сталкиваетесь частые передислокации.



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



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



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



Я действительно видел очень незначительные провалы в объеме используемого пространства Пермского генома, но не то, что я ожидал, и количество загруженных классов не упало.



Так есть способ, чтобы настроить 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: Sun Microsystems Inc.




обновление:



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



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



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



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

653   2  

2 ответов:

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

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

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

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

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

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

Comments

    Ничего не найдено.