Что делать с пространством Tomcat PermGen
ПРЕДПОСЫЛКИ. У меня есть веб-проект, в котором используется JSP. IDE - Eclipse.
Конфигурация tomcat: Автоматически публиковать, когда ресурсы меняются, а интервал публикации - "1 секунда".
Файл свойств в папке классов, который использовался для сохранения некоторых параметров. Он также может быть динамически модифицирован сервлетом. Операция изменения триггера сохраняется кнопкой сохранения в JSP.
ПРОБЛЕМА. После нескольких операций сохранения Tomcat поставляется с java.lang.OutOfMemoryError: PermGen space
.
СООБЩЕНИЕ СООБЩЕНИЙ
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)
Ответы
Ответ 1
Tomcat действительно нуждается в большом количестве пергентов. 512m не является необоснованным макс. Однако это только задерживает утечку горячего развертывания. Permgen будет расти ~ 25 мб на hotdeploy, что в Eclipse может быть каждый раз, когда вы сохраняете файл Java. 512m быстро исчезает, если у вас есть Ctrl + S, вроде меня.
Решение: разрешить Java удалять определения классов из памяти, т.е. мусорный сбор байтового кода. Добавьте их вместе с увеличенным размером пергентов:
-XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC
Ответ 2
Вы можете установить переменную среды с именем: "JAVA_OPTS
" и установить ее значение следующим образом -Xms256m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m
Ответ 3
ДЛЯ ECLIPSE
- Перейти к свойствам сервера
- Перейти на платформу
- Теперь в аргументе VM напишите это
-Xms256m -Xmx256m -XX: PermSize = 256 м -XX: MaxPermSize = 512 м
ДЛЯ NETBEANS
- Перейдите в папку Netbeans/etc/
- открыть файл netbeans.config в любом редакторе
- отредактируйте эту строку как
netbeans_default_options = "- J-client -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"
Thats all
Ответ 4
например:
-Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256m
![enter image description here]()
Ответ 5
Сервер Tomcat запускает разные JAVA, а eclipse работает в разных JAVA.
Поэтому добавление -XX:MaxPermSize=512m
в eclipse.ini
поможет решить эту проблему. Следуйте приведенным ниже инструкциям, чтобы добавить это на сервер tomcat:
-
Дважды щелкните сервер в eclipse
-
открыть конфигурацию запуска
-
добавьте "-XX: MaxPermSize = 512m" в аргументы VM на вкладке "Аргументы".
Ответ 6
Просто добавьте для Windows, если кто-то все еще застрял: -
- Откройте файл Catalina.bat(расположенный в папке установки /bin установки Apache tomcat)
-
Задайте JAVA_OPTS следующим образом в самом начале (до того, как оно будет сначала использовано в любом месте файла): -
установить JAVA_OPTS = -Dfile.encoding = UTF-8 -Xms128m -Xmx1024m -XX: PermSize = 64m -XX: MaxPermSize = 256m
-
Перезапустите Tomcat и сделайте это.
Вы можете найти приятное объяснение здесь