Это утечка памяти загрузчика классов. Каждый раз, когда вы повторно развертываете приложение, для него создается новый загрузчик классов, и все классы вашего приложения загружаются снова. Это потребляет память в perm gen пространстве.
Старый загрузчик классов и все его загруженные классы должны быть удалены сборщиком мусора, иначе вы в конечном итоге столкнетесь с OOME пространства PermGen после многократного развертывания. Это не работает, если объект, загруженный внешним загрузчиком классов, содержит ссылку на любой объект, загруженный старым загрузчиком классов. Эта статья дает хорошее объяснение проблемы.
Как правило, утечки загрузчика классов трудно анализировать, а иногда и исправить. Чтобы выяснить, почему старые загрузчики классов не собирают мусор, вы должны использовать профайлер. В JProfiler используйте обходчик кучи, выберите объекты загрузчика классов Glassfish и используйте представление входящих ссылок для проверки путей к корням сборщика мусора.
Класс загрузчика классов называется org.apache.servlet.jasper.JasperLoader. Вот скриншот обычной ситуации, когда загрузчик классов поддерживается только живыми экземплярами загруженных объектов.

В вашей ситуации вы должны увидеть ссылки из внешних объектов. Другой распространенной причиной утечки загрузчика классов в веб-контейнерах является неостановленный фоновый поток. Google Guice, например, имеет такую ошибку в 3.0.
(Отказ от ответственности: моя компания разрабатывает JProfiler)
person
Ingo Kegel
schedule
07.10.2011