Java Class (PermGen) Утечка памяти (веб-приложения) - Общее решение?

У меня есть утечка памяти пермского поколения, которую я знаю. Профилирование с помощью jvisualvm показывает, что при горячем развертывании (например, остановка и запуск приложения без уничтожения JVM, в tomcat, WebSphere, WebLogic и т.д.) - пространство PermGen постоянно увеличивается.

После прочтения, используя jhat и другие дополнительные инструменты, я понял, что у меня, вероятно, есть ссылка на WebAppClassLoader из класса где-то в его загрузчиках родительского класса.

Я не мог прикрепить его, хотя я сделал несколько массивных запросов на основе JavaScript на jhat

Нет ли простой утилиты, которая выясняет, кто несет ответственность за вас, загрузчик классов, чтобы не собирать мусор (таким образом, позволяя сборку мусора классов, загружаемых им)?

Я пробовал JProfiler, jvisualvm, jhat и много Google

всем друзьям LMGTFY - я провел около полутора дней, читая форумы с помощью пошаговых инструкций, не повезло. Я ищу утилиту или код, который выводит:

Объект X класса Y - единственный корень GC, который не позволяет удалить ваши классы.

Ответы

Ответ 1

Существует неудовлетворительное, но простое решение: не hotdeploy в производственных условиях. Вы можете настроить кластер из двух контейнеров сервлетов, и они будут обновлять по одному с перезагрузкой.

Ответ 2

Реальности частых перераспределений... Лучше всего вы можете увеличить размер perm gen с помощью -XX: MaxPermSize = 256 м. Это может принести вам несколько перераспределений за перезапуск jvm. Или читайте на http://my.opera.com/karmazilla/blog/2007/03/15/permgen-strikes-back

Остерегайтесь того, что если загрузчики классов вообще не могут быть gc-ed, вождение с jvm вообще не поможет. Вам стоит забыть о частых развертываниях, особенно в производстве, но тем не менее.