Проблема пространства PermGen с Glassfish / Hibernate - PullRequest
6 голосов
/ 01 апреля 2011

Я использую приложение GWT + Hibernate на Glassfish 3.1.Через несколько часов я выбегаю из пермгенского пространства.Это без каких-либо перезагрузок веб-приложения.Я использую –XX:MaxPermSize=256m –XmX1024m.

Я воспользовался советом этой страницы и обнаружил, что у меня пропадает тонна классов - все мои модели Hibernate и все мои GWTПрокси-серверы RequestFactory.

В указанном выше руководстве говорится, что «осмотрите цепочки, найдите случайную ссылку и исправьте код».Проще сказать, чем сделать.

Загрузчик классов всегда указывает на экземпляр org.glassfish.web.loader.WebappClassLoader.Копаясь дальше, я нахожу множество ссылок из $Proxy135 и объектов с аналогичными именами.Но я не знаю, как еще выполнить.

Ответы [ 4 ]

22 голосов
/ 01 апреля 2011

объекты нового класса помещаются в PermGen и, таким образом, занимают все больше места. Независимо от того, насколько велико пространство PermGen, оно неизбежно достигнет максимума после достаточного количества развертываний. Что вам нужно сделать, это принять меры, чтобы очистить PermGen, чтобы вы могли стабилизировать его размер. Есть два флага JVM, которые обрабатывают эту очистку:

-XX:+CMSPermGenSweepingEnabled

Этот параметр включает PermGen в запуск сборки мусора. По умолчанию пространство PermGen никогда не включается в сборку мусора (и, следовательно, увеличивается без границ).

-XX:+CMSClassUnloadingEnabled

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

4 голосов
/ 21 октября 2012

Я «решил» это, перейдя в Tomcat.

4 голосов
/ 26 июня 2011

Есть несколько хороших инструментов, чтобы помочь с этим, хотя вы никогда не узнаете об этом.JDK (1.6 u1 и выше) поставляется с jhat и jmap.Эти инструменты значительно помогут, особенно если вы используете поддержку запросов jhat JavaScript.

См .:

http://blog.ringerc.id.au/2011/06/java-ee-application-servers-learning.html

http://blogs.oracle.com/fkieviet/entry/classloader_leaks_the_dreaded_java

http://www.mhaller.de/archives/140-Memory-leaks-et-alii.html

http://blogs.oracle.com/sundararajan/entry/jhat_s_javascript_interface

2 голосов
/ 07 апреля 2011

(я не могу просмотреть предоставленную вами ссылку, поскольку она заблокирована websense, поэтому, если я повторяю что-либо, я извиняюсь)

Звучит так, как будто у вас есть утечка загрузчика классов.Их трудно отследить, добавьте эти параметры в параметры JVM в конфигурации вашего экземпляра

-XX:+PrintGCDetails
-XX:+TraceClassUnloading
-XX:+TraceClassLoading

Теперь, когда вы запускаете свое приложение, вы можете посмотреть файл jvm.log, расположенный в папке вашего домена / logs ипосмотрим что загружается и выгружается.Скорее всего, вы увидите, что один и тот же класс (ы) загружаются снова и снова.

Хорошим виновником является JAXB, особенно если вы создаете новый JAXBContext снова и снова.

...