Как убедиться, что Tomcat6 читает CATALINA OPTS в Windows?
У меня есть Tomcat6, работающий на машине Windows2003. Я развернул приложения 2 Grails на этом сервере, и вскоре я заметил, что все рушится через некоторое время после развертывания с классической ошибкой PermGen.
java.lang.OutOfMemoryError: PermGen space
java.lang.ClassLoader.defineClass1(Native Method)
java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
java.lang.ClassLoader.defineClass(ClassLoader.java:616)
org.codehaus.groovy.reflection.ClassLoaderForClassArtifacts.de
...
поэтому я нашел общее исправление для этой проблемы: увеличение кучи и пространства permgen с:
set CATALINA_OPTS="-Xms1024m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=512m"
добавлено в C:apache-tomcat-6.0.26bincatalina.летучая мышь. К сожалению, это не сработало, но проблема в том, что я не уверен, что Tomcat поднимает его. Я проверил различные журналы, но эти параметры никогда не распечатываются. Есть ли способ зарегистрировать их и убедиться, что Tomcat прочитал их?
EDIT: я попытался добавить следующие параметры JVM с помощью tomcat6w.exe:
-XX:+CMSClassUnloadingEnabled
-XX:+CMSPermGenSweepingEnabled
-XX:+UseConcMarkSweepGC
и ничего не изменилось. Я получаю permGen после 2-3 минут работы. Есть другие идеи?
Ура! Мулоне
4 ответов
спасибо всем! Я наконец решил проблему, добавив:
-XX:+CMSClassUnloadingEnabled
-XX:+CMSPermGenSweepingEnabled
-XX:+UseConcMarkSweepGC
-XX:PermSize=128m
-XX:MaxPermSize=512m
к параметрам java на tomcat6w.exe - ...
спасибо!
фактический способ сделать это (в Каталине.летучая мышь),
set "JAVA_OPTS=-Djava.awt.headless=true -server -Xms512m -Xmx2048m -XX:PermSize=512m -XX:MaxPermSize=1024m -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled"
добавьте эту строку в такое положение, чтобы этот JAVA_OPTS был передан любой команде _EXECJAVA в конце файла (если-else вложен). Я лично пишу эту строку как первый оператор этой партии
Я фактически установил их как JAVA_OPTS для моей JVM перед запуском сервера
JAVA_OPTS=-Djvmarg='-Xms1024m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=512m'
посмотрите, где вы его устанавливаете, используйте echo [statements]
чтобы устранить неполадки, попробуйте установить его прямо перед его передачей на виртуальную машину, что-то вроде:
set CATALINA_OPTS="-Xms1024m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=512m"
_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS%
-Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%"
-Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%"
-Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
убедитесь, что у вас есть право EXEC_JAVA
не уверен, какая версия у вас есть, но, вероятно, несколько if
заявления.
также убедитесь, что это допустимые аргументы для вашей виртуальной машины.
вы можете проверить свой максимальный размер кучи в вашем коде java, используйте:
long heapMaxSize = Runtime.getRuntime().maxMemory();
просто распечатайте его, если его правильный на основе ваших настроек, у вас есть плохая утечка памяти, если ее нет, то tomcat
не поднимает его.