Ошибка пространства PermGen - сервер Glassfish - PullRequest
31 голосов
/ 07 октября 2011

Я использую веб-приложение на Java, использующее сервер Hibernate и Glassfish.Я получаю исключение

java.lang.OutOfMemoryError: PermGen space, когда после его развертывания несколько раз.

Я пытался -XX:MaxPermSize=128M в своих переменных среды, но это не работает.

Ответы [ 4 ]

47 голосов
/ 09 ноября 2011

Для решения этой проблемы (в ОС Linux на основе Linux) выполните следующие действия:

1) увеличение памяти (чтобы эта проблема возникала не часто) путем настройки «domain.xml» в

/ GlassFish / домен / domain1 / конфигурации

поиск

<jvm-options>-XX:MaxPermSize=

set it to higher value eg- 198m or 256m

2) убить процесс glassfish, чтобы освободить порт, на котором он работал ( в моем случае это было 8686 ) открыть терминал (в ОС linux) и набрать -

sudo netstat -npl | grep 8686

это приведет к чему-то вроде ..

tcp6 0 0 :::8686 :::* LISTEN 3452/java

следующее использование

kill -9 3452 чтобы убить этот процесс (3452 в данном случае)

Теперь попробуйте запустить Glassfish, он должен запуститься.

38 голосов
/ 07 октября 2011

Это утечка памяти загрузчика классов.Каждый раз, когда вы повторно развертываете приложение, для него создается новый загрузчик классов, и все классы вашего приложения загружаются снова.Это потребляет память в пространстве perm gen.

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

Как правило, утечки загрузчика классов трудно анализировать, а иногда трудно исправить.Чтобы выяснить, почему старые загрузчики классов не являются сборщиком мусора, вы должны использовать профилировщик.В JProfiler используйте обходчик кучи, выберите объекты загрузчика классов glassfish и используйте представление входящих ссылок для проверки путей к корням сборщика мусора.

Класс загрузчика классов называется org.apache.servlet.jasper.JasperLoader.Вот снимок экрана обычной ситуации, когда загрузчик классов удерживается только живыми экземплярами загруженных объектов.

enter image description here

В вашей ситуации вы должны видеть ссылки со сторонних объектов.Другой распространенной причиной утечки загрузчика классов в веб-контейнерах является фоновый поток, который не останавливается.Например, в Google Guice есть такая ошибка в версии 3.0.

(Отказ от ответственности: моя компания разрабатывает JProfiler)

10 голосов
/ 09 июля 2013

Если вы используете Windows, попробуйте убить процесс glassfish (java.exe * 32) с помощью диспетчера задач, а затем перезапустите сервер.

4 голосов
/ 07 октября 2011

Эта проблема возникает при итеративном развертывании много раз.Я сталкивался с этим много раз.Пожалуйста, обратитесь к ссылке ниже JIRA для ошибки Glassfish:

http://java.net/jira/browse/GLASSFISH-587

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...