Работа с ошибкой "java.lang.OutOfMemoryError: PermGen space" - PullRequest
1207 голосов
/ 18 сентября 2008

Недавно я столкнулся с этой ошибкой в ​​моем веб-приложении:

java.lang.OutOfMemoryError: PermGen space

Это типичное приложение Hibernate / JPA + IceFaces / JSF, работающее на Tomcat 6 и JDK 1.6. По-видимому, это может произойти после повторного развертывания приложения несколько раз.

Что вызывает это и что можно сделать, чтобы этого избежать? Как мне решить проблему?

Ответы [ 32 ]

15 голосов
/ 18 сентября 2008

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

http://www.oracle.com/technetwork/middleware/jrockit/overview/index.html

13 голосов
/ 04 декабря 2010

У меня была проблема, о которой мы здесь говорим, мой сценарий - eclipse-helios + tomcat + jsf, и вы делали развертывание простого приложения для tomcat. Я показывал здесь ту же проблему, решил ее следующим образом.

В eclipse перейдите на серверы , дважды щелкните по зарегистрированному серверу в моем случае tomcat 7.0, он откроет мой файловый сервер Общие регистрационные данные. В разделе «Общая информация» нажмите на ссылку «Открыть конфигурацию запуска» , это открывает выполнение параметров сервера на вкладке «Аргументы» в аргументах виртуальной машины, добавленных в конце этих двух записей

-XX: MaxPermSize = 512m
-XX: PermSize = 512m

и готово.

13 голосов
/ 04 августа 2014

Самый простой ответ в наши дни - использовать Java 8.

Он больше не резервирует память исключительно для пространства PermGen, позволяя памяти PermGen смешиваться с обычным пулом памяти.

Имейте в виду, что вам придется удалить все нестандартные параметры запуска -XXPermGen...=... JVM, если вы не хотите, чтобы Java 8 жаловалась, что они ничего не делают.

8 голосов
/ 20 марта 2013
  1. Откройте tomcat7w из каталога bin Tomcat или введите Monitor Tomcat в меню Пуск (открывается окно с вкладками с различной служебной информацией).
  2. В текстовой области Java Options добавьте эту строку:

    -XX:MaxPermSize=128m
    
  3. Установите начальный пул памяти на 1024 (необязательно).
  4. Установите Максимальный пул памяти на 1024 (необязательно).
  5. Нажмите Ok.
  6. Перезапустите службу Tomcat.
6 голосов
/ 15 сентября 2014

Ошибка Пермского пространства возникает из-за использования большого пространства, а не предоставленного jvm пространства для выполнения кода. Лучшее решение этой проблемы в операционных системах UNIX - изменить некоторые настройки в файле bash. Следующие шаги решают проблему.

Запустить команду gedit .bashrc на терминале.

Создать JAVA_OTPS переменную со следующим значением:

export JAVA_OPTS="-XX:PermSize=256m -XX:MaxPermSize=512m"

Сохранить файл bash. Запустите команду exec bash на терминале. Перезагрузите сервер.

Я надеюсь, что этот подход сработает над вашей проблемой. Если вы используете версию Java ниже 8, эта проблема иногда возникает. Но если вы используете Java 8, проблема никогда не возникает.

5 голосов
/ 06 июня 2011

Также, если вы используете log4j в своем веб-приложении, проверьте этот пункт в log4j документации .

Похоже, что если вы используете PropertyConfigurator.configureAndWatch("log4j.properties"), вы вызываете утечки памяти при удалении из веб-приложения.

5 голосов
/ 12 июля 2012

Увеличение размера постоянной генерации или настройка параметров GC НЕ поможет, если у вас есть реальная утечка памяти. Если ваше приложение или какая-либо сторонняя библиотека, которую оно использует, пропускает загрузчики классов, единственное реальное и постоянное решение - найти эту утечку и исправить ее. Есть ряд инструментов, которые могут вам помочь, одним из последних является Plumbr , который только что выпустил новую версию с необходимыми возможностями.

4 голосов
/ 18 сентября 2008

решил это и для меня; Тем не менее, я заметил, что время перезапуска сервлета было намного хуже, поэтому, хотя он был лучше в производстве, это было своего рода тормозом в разработке.

4 голосов
/ 01 июля 2009

У меня есть комбинация Hibernate + Eclipse RCP, пробовал использовать -XX:MaxPermSize=512m и -XX:PermSize=512m, и, похоже, у меня работает.

4 голосов
/ 28 апреля 2010

Set -XX:PermSize=64m -XX:MaxPermSize=128m. Позже вы также можете попробовать увеличить MaxPermSize. Надеюсь, это сработает. То же самое работает для меня. Установка только MaxPermSize у меня не сработала.

...