Ошибка пространства 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 sun.nio.ch.SelectionKeyImpl@4ae53a99
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.ленг.OutOfMemoryError: PermGen space) снова и снова. Любая помощь будет оценена по достоинству. Я также читал другой пост в stackoverflow также, но это не сработало.

578   11  

11 ответов:

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

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

-XX:MaxPermSize=SIZE

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

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled

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

нужно выделить больше пространства для PermGenSpace в Tomcat, JVM-машины.

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

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

на стороне Примечание, Вы можете контролировать размер пространства PermGen с JVisualVM и вы даже можете проверить его довольствуйтесь YourKit Java Для Профайлера

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

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

Если tomcat работает как служба Windows, ни CATALINA_OPTS, ни JAVA_OPTS, похоже, не имеют никакого эффекта.

вам нужно установить его в настройках Java в GUI.

ниже ссылка объясняет это хорошо

http://www.12robots.com/index.cfm/2010/10/8/Giving-more-memory-to-the-Tomcat-Service-in-Windows

этот работал на меня, в 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

В Версии Установщика Службы Windows Tomcat 7.0.Там нет Каталины.летучая мышь в / бин . Так что вам нужно открыть Tomcat7w.exe в /bin и добавить удар JVM аргумент

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

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

enter image description here

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

enter image description here

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

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

- XX: MaxPermSize=256m

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

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

я запускаю 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

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

Если вы используете eclipse с tomcat выполните следующие действия

  1. в окне сервера дважды щелкните на tomcat, он откроет окно обзора tomcat .

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

  3. В окне редактирования конфигурации искать Аргументы и щелкнуть по нему.
  4. в теге аргументов ищите параметры VM.
  5. просто вставьте этот - Xms256m-Xmx512m-XX: PermSize=256m-XX: MaxPermSize=512m до конца аргументов.

edit launch configuration properties

Я пробовал то же самое на Intellij Ideav11.

Он не собирал настройки после проверки процесса с помощью grep. В случае, если это не так, дайте настройки mem для JAVA_OPTS в catalina.sh вместо этого.

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

Comments

    Ничего не найдено.