2010-08-27 2 views
6

Ich habe eine Tomcat6 läuft auf einem Windows2003-Rechner. Ich habe 2 Grails-Apps auf diesem Server installiert und merkte bald, dass nach dem Deployment mit einem klassischen PermGen-Fehler alles abstürzte.Wie stelle ich sicher, dass Tomcat6 CATALINA_OPTS unter Windows liest?

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 
... 

So fand ich eine gemeinsame Lösung für dieses Problem: Erhöhen Heap und PermGen Raum mit:

set CATALINA_OPTS="-Xms1024m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=512m" 

in C Hinzugefügt: \ Apache-tomcat-6.0.26 \ bin \ catalina.bat. Leider hat das nicht funktioniert, aber das Problem ist, dass ich nicht sicher bin, ob Tomcat es aufhebt. Ich habe verschiedene Protokolle überprüft, aber diese Optionen werden nie ausgedruckt. Gibt es eine Möglichkeit, sie zu protokollieren und sicherzustellen, dass Tomcat sie gelesen hat?

EDIT: Ich habe versucht, die folgenden JVM-Optionen mit tomcat6w.exe hinzuzufügen:

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

Und nichts geändert. Ich bekomme eine PermGen nach 2-3 Minuten Betriebszeit. Irgendeine andere Idee?

Prost! Mulone

+0

Welche Java vm verwenden Sie? – Joelio

+0

Guter Punkt: C: \ Programme \ Java \ jdk1.6.0_19 \ jre \ bin \ server \ jvm.dll – Mulone

+0

Diese Art von Frage ist für Serverfault.com, denke ich. – Ither

Antwort

6

Sie alle danken beginnen! Ich löste schließlich das Problem durch Zugabe:

-XX:+CMSClassUnloadingEnabled 
-XX:+CMSPermGenSweepingEnabled 
-XX:+UseConcMarkSweepGC 
-XX:PermSize=128m 
-XX:MaxPermSize=512m 

zu den Java-Optionen auf tomcat6w.exe.

Danke!

0

Schauen Sie, wo Sie es einstellen, echo [statements] verwenden zu beheben, versuchen Sie es direkt vor seiner übergeben an die VM einstellen, so etwas wie:

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% 

Stellen Sie sicher, die richtige EXEC_JAVA nicht sicher haben, welche Version von der .bat Datei haben Sie, aber wahrscheinlich mehrere if Aussagen.

Stellen Sie außerdem sicher, dass dies gültige Argumente für Ihre VM sind.

Sie können Ihren max Heap-Größe in Ihrer Java-Code, Verwendung überprüfen:

long heapMaxSize = Runtime.getRuntime().maxMemory(); 

es Drucken Sie einfach aus, wenn sie richtig auf der Grundlage Ihrer Einstellungen, Sie einen schlechten Speicherverlust hat, wenn sie nicht, dann tomcat hebt es nicht ab.

1

ich diejenigen, die als JAVA_OPTS für meine JVM tatsächlich eingestellt, bevor der Server

JAVA_OPTS=-Djvmarg='-Xms1024m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=512m' 
4

tatsächliche Art und Weise, es zu tun (in catalina.bat),

set "JAVA_OPTS=-Djava.awt.headless=true -server -Xms512m -Xmx2048m -XX:PermSize=512m -XX:MaxPermSize=1024m -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled" 

diese Zeile hinzufügen, in einer solchen Position, so dass diese JAVA_OPTS zu einem _EXECJAVA Befehl am Ende der Datei übertragen wird (if-else verschachtelt). Ich persönlich schreibe diese Zeile als erste Anweisung dieser Charge

+0

Tomcat-Entwickler empfehlen, Ihre Anpassungen getrennt zu halten. Verwenden Sie die Datei "% CATALINA_BASE% \ bin \ setenv.bat", um die Variablen festzulegen, anstatt sie in "catalina.bat" zu ändern. – naXa