Этот вопрос предназначен для всех, кто когда-либо проверял кнопку «Найти утечки» в менеджере 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 ).