2012-04-10 2 views
25

ПРЕДПОСЫЛКИ: У меня есть веб-проект, в котором используется JSP. IDE - Eclipse. Конфигурация tomcat: автоматически публикуется при изменении ресурсов, а интервал публикации - «1 секунда».Что делать с tomcat PermGen space

Файл свойств в папке классов, который использовался для сохранения некоторых параметров. Он также может быть динамически модифицирован сервлетом. Операция изменения триггера сохраняется кнопкой сохранения в JSP.

ПРОБЛЕМА: После нескольких операций сохранения Tomcat поставляется с java.lang.OutOfMemoryError: PermGen space.

LOG MESSAGE

java.lang.OutOfMemoryError: PermGen space 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:616) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) 
    at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1815) 
    at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:872) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1325) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204) 
    at org.apache.catalina.startup.WebAnnotationSet.loadApplicationServletAnnotations(WebAnnotationSet.java:108) 
    at org.apache.catalina.startup.WebAnnotationSet.loadApplicationAnnotations(WebAnnotationSet.java:58) 
    at org.apache.catalina.startup.ContextConfig.applicationAnnotationsConfig(ContextConfig.java:297) 
    at org.apache.catalina.startup.ContextConfig.start(ContextConfig.java:1064) 
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:261) 
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120) 
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4238) 
    at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3083) 
    at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:404) 
    at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1279) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1571) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1580) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1580) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1560) 
    at java.lang.Thread.run(Thread.java:662) 
+0

Потенциальный дубликат. http://stackoverflow.com/questions/88235/how-to-deal-with-java-lang-outofmemoryerror-permgen-space-error – Phani

+3

Я получаю эту ошибку с Tomcat всякий раз, когда люди повторно развертывают веб-приложение повторно, без перезапуска Tomcat , Из-за утечки, связанной с процессом загрузки классов, пространство permgen становится немного более полным с каждым повторным развертыванием. Увеличение размера перггенса приведет к задержке точки, в которой она закончилась, но на самом деле вам нужно, чтобы Tomcat отскакивал при повторном развертывании webapp. – Jon

+2

Пожалуйста, ознакомьтесь с приведенной ниже статьей, в которой полностью объясняется, как настроить tomcat для увеличения permGen [Tomcat PermGen Space] (http://www.mkyong.com/tomcat/tomcat-javalangoutofmemoryerror-permgen-space/) – Phani

ответ

11

Вы можете установить переменную окружения с именем: "JAVA_OPTS" и установите значение его следующим образом -Xms256m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m

+0

при этом plz не пропустите символы «-». –

+0

Кажется, чтобы избежать проблемы, но не очень хорошее решение. Я сомневаюсь, что сохранение данных часто в файле свойств является неправильным дизайном, если это плохо, что это должно быть – SKing7

+2

Это -Xms256m -Xmx1024m на самом деле. Xms - это начальный размер, а Xmx - максимальный размер кучи. –

34

Tomcat делает нужно много PermGen. 512m не является необоснованным макс. Однако это только задерживает утечку горячего развертывания. Permgen будет расти ~ 25 мб на hotdeploy, что в Eclipse может быть каждый раз, когда вы сохраняете файл Java. 512m быстро исчезает, если у вас есть Ctrl + S, вроде меня.

Решение: разрешить Java удалять определения классов из памяти, т. Е. Мусорный сбор байтового кода. Добавьте их вместе с вашим увеличили PermGen размер:

-XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC 
+0

@dldnh вы можете указать полную строку, которая должна быть добавлена ​​в файл setenv.sh –

5

установки, как это:

-Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256m 

enter image description here

0

сервер Tomcat работает другое JAVA и затмение работает в различных JAVA.

Поэтому добавление -XX:MaxPermSize=512m в eclipse.ini поможет решить эту проблему. Выполните следующие шаги, чтобы добавить это TOMCAT сервер:

  • Двойной щелчок сервера в затмение

  • открыт запуск конфигурации

  • добавить "-XX: MaxPermSize = 512m" аргументы VM в Вкладка «Аргументы».

6

ДЛЯ ECLIPSE

  1. Перейти к свойствам сервера
  2. Перейти к платформе
  3. Сейчас в VM аргументу написать этот -Xms256m -Xmx256m -XX: PermSize = 256m -XX: MaxPermSize = 512m

FOR N ETBEANS

  1. Перейти к Netbeans папку/и т.д./
  2. открытым netbeans.config в любом редакторе
  3. редактировать эту строку, как

netbeans_default_options = "- J-клиент -J-Xss256m -J-Xms256m -J-XX: PermSize = 256m -XX: MaxPermSize = 512m -J-Dapple.laf.useScreenMenuBar = true -J-Dapple.awt.graphics.UseQuartz = true -J-Dsun.java2d.noddraw = true -J-Dsun.java2d.dpiaware = true -J-Dsun.zip.disableMemoryMapping = true "

Это все

0

Просто добавить для Windows, если кто-то до сих пор застрял: -

  1. Открыть файл catalina.bat (расположенный в Apache Tomcat папке установки/BIN)
  2. Set JAVA_OPTS следующим образом в самом начале (до фактического его первого использования в любом месте файла): -

    набор JAVA_OPTS = -Dfile.encoding = UTF-8 -Xms128m -Xmx1024m -XX: PermSize = 64m -XX: MaxPermSize = 256 м

  3. Restart Tomcat и его выполнение.

Вы можете найти оригинальное объяснение here

Смежные вопросы