Решение проблемы PermGen при повторном развертывании с помощью Jetty 7

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

После долгих радостей я попытался сделать повторное развертывание приложения без утечек в нашей среде разработки, состоящей из Maven и плагина Jetty.

К сожалению, я, похоже, столкнулся с ограничением сервера, как показано на скриншоте ниже.

Снимок Yourkit http://img811.imageshack.us/img811/7320/jettyclassloaderbeanelr.png< /а>

Потоки запросов Jetty имеют сильную ссылку на BeanElResolver, который, в свою очередь, имеет сильную ссылку на несколько классов из моего веб-приложения.

Я не нашел ссылки на то, как очистить эту информацию.

Как я могу удалить эту последнюю PermGen утечку из моего приложения?


Обновлять:

Я сделал следующее, чтобы решить проблему, но безуспешно:

  • обновлен до последней версии плагина Jetty (7.4.5 и 8.0.0.M3)
  • использовал коллектор CMS: -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled

Обновление 2:


person Robert Munteanu    schedule 25.07.2011    source источник
comment
Я не понимаю вашей формулировки. Что вы имеете в виду под PermGen-Leak? Вы пытались передать виртуальным машинам флаги, связанные с soem GC, например: -XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled ? Ожидаете ли вы, что работающее веб-приложение будет полностью собрано, когда нет соединения/сеанса?   -  person Angel O'Sphere    schedule 25.07.2011
comment
Ангел: по умолчанию ваш контейнер сервлета пропускает загрузчики классов при каждом повторном развертывании. Определения классов выделяются из постоянного поколения, поэтому вы получите утечку PermGen. Я впечатлен, что ОП удалось обойти эту проблему с Tomcat 6 и без флагов.   -  person Daniel Lyons    schedule 25.07.2011
comment
Роберт: пожалуйста, расскажите нам больше о том, что вы сделали, чтобы исправить утечку в Tomcat 6! Я хотел бы знать, что ты сделал. Вики, наверное?   -  person Daniel Lyons    schedule 25.07.2011
comment
@Angel: я не использую сборщик мусора CMS, поэтому мне не нужно указывать эти флаги. И с утечкой PermGen я имею в виду, что при отмене развертывания старый экземпляр загрузчика классов остается закрепленным в памяти, не позволяя классам собирать мусор.   -  person Robert Munteanu    schedule 25.07.2011
comment
Вот почему я предложил использовать другой GC, стандартный GC вообще не собирает permgen, IIRC.   -  person Angel O'Sphere    schedule 26.07.2011


Ответы (2)


Это реальная ошибка в реализации EL, которая исправлена ​​в последних версиях Jetty.

Версия 7.5.0 после выпуска будет содержать исправление.

person Robert Munteanu    schedule 29.07.2011

Не прямой ответ на ваш вопрос, но вы можете рассмотреть возможность использования JRebel в dev. С JRebel вам, как правило, не нужно повторно развертывать, что позволяет избежать как утечек permgen, так и потерь времени на повторное развертывание. Это работает очень хорошо для меня.

person Ryan Stewart    schedule 25.07.2011
comment
Я уже использую JRebel, но а) мне иногда приходится перезагружаться, б) не все в моей команде так делают, поэтому мне нужно найти лучшее решение и для них. - person Robert Munteanu; 25.07.2011