Подтвердить что ты не робот

Пространство PermGen Ошибка в tomcat

Я работаю в среде Windows. И я получаю эту ошибку каждый раз, когда я работаю с tomcat -

Apr 30, 2012 5:30:37 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet default threw exception
java.lang.OutOfMemoryError: PermGen space
2012-04-30 17:30:37.719 INFO net.spy.memcached.MemcachedConnection:  Connection state changed for [email protected]
2012-04-30 17:30:37.719 INFO net.spy.memcached.MemcachedConnection:  Reconnecting due to failure to connect to {QA sa=localhost/127.0.0.1:11211, #Rops=0, #Wops=0, #iq=0, topRop=null, topWop=null, toWrite=0, interested=0}
java.net.ConnectException: Connection refused: no further information
Apr 30, 2012 5:30:37 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet default threw exception
java.lang.OutOfMemoryError: PermGen space
Exception in thread "Memcached IO over {MemcachedConnection to localhost/127.0.0.1:11211}" java.lang.OutOfMemoryError: PermGen space
Apr 30, 2012 5:30:38 PM org.apache.coyote.http11.Http11Processor process
SEVERE: Error processing request
java.lang.OutOfMemoryError: PermGen space
Apr 30, 2012 5:30:38 PM org.apache.coyote.http11.Http11Processor process
SEVERE: Error processing request
java.lang.OutOfMemoryError: PermGen space
Apr 30, 2012 5:30:38 PM org.apache.coyote.http11.Http11Processor process
SEVERE: Error processing request
java.lang.OutOfMemoryError: PermGen space
Apr 30, 2012 5:30:41 PM org.apache.catalina.connector.CoyoteAdapter service
SEVERE: An exception or error occurred in the container during the request processing
java.lang.OutOfMemoryError: PermGen space
Apr 30, 2012 5:30:43 PM org.apache.catalina.core.StandardHostValve custom
SEVERE: Exception Processing ErrorPage[exceptionType=java.lang.Throwable, location=/error.action]
java.lang.OutOfMemoryError: PermGen space
Apr 30, 2012 5:30:42 PM org.apache.catalina.core.StandardHostValve custom
SEVERE: Exception Processing ErrorPage[exceptionType=java.lang.Throwable, location=/error.action]
java.lang.OutOfMemoryError: PermGen space
Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" java.lang.OutOfMemoryError: PermGen space

Я попытался добавить JAVA_OPTS with the value as -Xms1024m -Xmx1024m в системные переменные, но все же я снова и снова получаю ту же ошибку (java.lang.OutOfMemoryError: пространство PermGen). Любая помощь будет оценена. Я также прочитал другое сообщение в stackoverflow, но это не сработало.

4b9b3361

Ответ 1

Пространство PermGen - это то, что Tomcat использует для хранения определений классов (только определений, без экземпляров) и пулов строк, которые были интернированы. Исходя из опыта, проблемы пространства PermGen часто происходят в средах разработчиков, поскольку Tomcat должен загружать новые классы каждый раз, когда он развертывает WAR или делает jspc (при редактировании файла jsp). Лично я склонен развертывать и повторно развертывать войны во время тестирования Im in dev, так что я знаю, что Im рано или поздно заканчивается (в первую очередь потому, что циклы Javas GC по-прежнему выглядят довольно храбрыми, поэтому, если вы повторно развертываете свои войны быстро и достаточно часто, пространство заполняется быстрее, чем они могут управлять).

Это теоретически должно быть менее проблематичным в производственных средах, поскольку вы (надеюсь) не меняете кодовую базу на 10-минутной основе. Если это все еще происходит, это просто означает, что ваша кодовая база (и соответствующие зависимости в библиотеке) слишком велика для распределения памяти по умолчанию, и вам просто нужно обходиться со стеком и распределением кучи. Я думаю, что стандарты такие, как:

-XX:MaxPermSize=SIZE

Однако я обнаружил, что лучший способ позаботиться об этом - это позволить разгружать классы, чтобы ваш PermGen никогда не заканчивался:

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled

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

Ответ 2

Вы должны выделить больше пространства для PermGenSpace для JVM tomcat.

Это можно сделать с помощью аргумента JVM: -XX: MaxPermSize = 128m

По умолчанию пространство PermGen равно 64M (и оно содержит все скомпилированные классы, поэтому, если у вас много jar (classes) в вашем пути к классам, вы действительно можете заполнить это пространство).

На боковой заметке вы можете отслеживать размер пространства PermGen с помощью JVisualVM, и вы даже можете проверить его содержимое с помощью Профайлер MyKit Java

Ответ 3

Чтобы дополнить ответ Майкла и в соответствии с этим ответом, безопасный способ справиться с этой проблемой состоит в использовании следующих аргументов:

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled -XX:+UseConcMarkSweepGC

Ответ 5

@AndreSmiley код строки работал у меня.

требуется только модификация.

-XX: MaxPermSize = 256 т

"m" означает MB.

На самом деле мое приложение очень велико, поэтому мне было рекомендовано сделать его 1024 м для производительности.

Ответ 6

В Tomcat 7.0 версия установщика Windows версии. В каталоге /bin отсутствует файл catalina.bat. Таким образом, вам нужно открыть Tomcat7w.exe в /bin и добавить аргумент JVM удара

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

на Java Option в Java Tab, например. Вы также добавляете другие варианты.

введите описание изображения здесь

Другой, если вы используете IntellijIDEA, вам нужно добавить аргумент JVM в конфигурации сервера, например.

введите описание изображения здесь

Ответ 7

Это работало для меня, в startup.bat следующая строка должна быть добавлена, если она не существует set JAVA_OPTS со значением -Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256. Полная строка:

set JAVA_OPTS=-Dfile.encoding=UTF-8 -Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256

Ответ 8

Если вы используете eclipse с tomcat, выполните следующие шаги

  • В окне сервера Двойной щелчок на tomcat, он откроет окно обзора tomcat.

  • В окне "Обзор" вы найдете Открыть конфигурацию запуска в разделе Общая информация и нажмите Открыть конфигурацию запуска.

  • В окне редактирования конфигурации найдите Аргументы и нажмите "И".
  • В теге аргументов найдите аргументы VM.
  • просто вставьте это -Xms256m -Xmx512m -XX: PermSize = 256m -XX: MaxPermSize = 512m до конца аргументов.

изменить свойства конфигурации запуска

Ответ 9

Я запускаю tomcat7 на CentOS 6.6. Я попытался создать новый файл /usr/share/tomcat/bin/setenv.sh и установить как JAVA_OPTS, так и CATALINA_OPTS. Но tomcat не будет получать значения при перезагрузке. Когда я помещаю следующую строку в /etc/tomcat/tomcat.conf:

CATALINA_OPTS="-Xms128m -Xmx1024m -XX:MaxPermSize=1024m"

tomcat взял новую переменную среды. Я проверил это, запустив

ps aux | grep tomcat

и видя новые настройки на выходе. Это заняло много времени, чтобы диагностировать, и я не видел, чтобы кто-то еще предлагал это, поэтому я думал, что выброшу его в интернет-сообщество.

Ответ 10

Убийство процесса tomcat (принудительно, kill -9 для Linux), и его запуск снова решает проблему. Я предполагаю, что экземпляр tomcat не будет убит должным образом, используя shutdown.bat. Итак, нам нужно принудительно убить процесс и начать снова.