2010-08-27 7 views
6

Possiedo un Tomcat6 in esecuzione su un computer Windows2003. Ho distribuito 2 app Grails su questo server e presto ho notato che tutto si stava bloccando a volte dopo la distribuzione con un errore PermGen classico.Come assicurarsi che Tomcat6 legga CATALINA_OPTS su Windows?

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

Così ho trovato una soluzione comune per questo problema: aumentare mucchio e lo spazio PermGen con:

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

Aggiunto in C: \ apache-tomcat-6.0.26 \ bin \ catalina.bat. Purtroppo questo non ha funzionato, ma il problema è che non sono sicuro che Tomcat lo stia riprendendo. Ho controllato vari registri ma queste opzioni non sono mai state stampate. C'è un modo per registrarli e assicurarsi che Tomcat li abbia letti?

EDIT: Ho provato ad aggiungere le seguenti opzioni JVM con tomcat6w.exe:

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

E non è cambiato nulla. Ottengo un permGen dopo 2-3 minuti di operatività. Qualche altra idea?

Cheers! Mulone

+0

Quale java VM stai usando? – Joelio

+0

Buon punto: C: \ Programmi \ Java \ jdk1.6.0_19 \ jre \ bin \ server \ jvm.dll – Mulone

+0

Questo tipo di domanda è per serverfault.com, credo. – Ither

risposta

6

Grazie a tutti! ho finalmente risolto il problema aggiungendo:

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

Per le opzioni Java su tomcat6w.exe.

Grazie!

0

Guarda dove si sta impostando esso, utilizzare echo [statements] per risolvere i problemi, provare con un valore proprio accanto alla sua passata al VM, qualcosa come:

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% 

Assicurarsi di avere il diritto EXEC_JAVA non è sicuro che la versione del file .bat, ma probabilmente diverse istruzioni if.

Assicurarsi inoltre che questi siano argomenti validi per la VM.

È possibile controllare la dimensione massima heap all'interno del codice Java, uso:

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

Basta stamparlo, se corretta in base alle impostazioni, si dispone di una perdita di memoria male, se no, allora tomcat non lo sta raccogliendo.

1

realtà ho impostato come quelli JAVA_OPTS per la mia JVM prima di avviare il server

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

modo effettivo farlo (in catalina.bat),

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

aggiungere questa linea in una posizione tale che questo JAVA_OPTS viene trasferita su qualsiasi comando _EXECJAVA alla fine del file (if-else nidificato). Personalmente scrivo questa riga come prima affermazione di questo lotto

+0

Gli sviluppatori Tomcat consigliano di mantenere separate le personalizzazioni. Usa il file "% CATALINA_BASE% \ bin \ setenv.bat" per impostare le variabili invece di modificarle all'interno di "catalina.bat". – naXa

Problemi correlati