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