Насколько я понимаю, типичные утечки памяти PermGen выглядят следующим образом.
Где-то существует доступная ссылка на некоторый объект, класс которого был заменен на горячее развертывание.
Этот объект имеет ссылку на свой дескриптор класса.
Дескриптор класса имеет ссылку на его ClassLoader.
ClassLoader содержит ссылки на дескрипторы классов для всех классов, которые он загрузил.
Каждый дескриптор класса имеет ссылки на фрейм статики классов, его байт-коды, его собственный код и т. Д.
Достаточно одной ссылки на один объект, чтобы вызвать утечку пермгена. Если бы могло быть значение enum, слушатель, который не был незарегистрирован, ...
EDIT
Обычный подход, который используют люди, сталкивающиеся с этой проблемой, - пожать плечами и увеличить размер кучи PermGen. Если вам действительно нужно решить проблему с вашим веб-приложением (ями), то:
- Посмотрите, как закрывается ваше веб-приложение, убедитесь, что соединения с базой данных / пулы соединений закрыты, все обратные вызовы не зарегистрированы и т. Д.
- Используйте профилировщик памяти Java для отслеживания утечек памяти PermGen (и других), вызванных повторным развертыванием.
- Будьте готовы повторить этот процесс, если будут обнаружены новые утечки по мере развития вашего веб-приложения.
Я не знаю, есть ли какие-то специфические проблемы с Hibernate, но любая сложная инфраструктура потенциально восприимчива к такого рода проблемам, либо сама по себе, либо в сочетании с кодом приложения.