2010-08-27 12 views
6

Tengo un Tomcat6 ejecutándose en una máquina con Windows2003. Implementé 2 aplicaciones de Grails en este servidor y pronto me di cuenta de que todo estaba fallando en algún momento después del despliegue con un error clásico de PermGen.¿Cómo asegurarse de que Tomcat6 lea CATALINA_OPTS en 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 
... 

así que encontré una solución común para este problema: el aumento montón y espacio PermGen con:

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

Agregado a C: \ apache-tomcat-6.0.26 \ bin \ catalina.bat. Lamentablemente, esto no funcionó, pero el problema es que no estoy seguro de que Tomcat lo esté recogiendo. Revisé varios registros, pero estas opciones nunca se imprimen. ¿Hay alguna forma de registrarlos y asegurarse de que Tomcat los haya leído?

EDIT: He intentado añadir las siguientes opciones de JVM con tomcat6w.exe:

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

Y nada ha cambiado. Obtengo un permGen después de 2-3 minutos de actividad. ¿Alguna otra idea?

¡Salud! Mulone

+0

¿Qué java vm estás usando? – Joelio

+0

Buen punto: C: \ Archivos de programa \ Java \ jdk1.6.0_19 \ jre \ bin \ server \ jvm.dll – Mulone

+0

Este tipo de pregunta es para serverfault.com, supongo. – Ither

Respuesta

6

Gracias a todos! finalmente resuelto el problema agregando:

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

Para las opciones de Java en tomcat6w.exe.

Gracias!

0

Mira dónde está configurando, usarlo echo [statements] para solucionar problemas, pruebe a ajustarla a la derecha antes de su pasado a la máquina virtual, algo así como:

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% 

Asegúrese de que usted tiene el derecho EXEC_JAVA no está seguro de qué versión del archivo .bat que tiene, pero probablemente varias declaraciones if.

También asegúrese de que estos sean argumentos válidos para su máquina virtual.

Puede comprobar el tamaño de almacenamiento dinámico máximo dentro de su código de Java, utilice:

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

Sólo imprimirlo, si es correcto en función de la configuración, usted tiene una pérdida de memoria mala, si no es, entonces tomcat no lo está recogiendo.

1

realidad puse los JAVA_OPTS como para mi JVM antes de iniciar el servidor

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

forma real de hacerlo (en catalina.bat),

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

añadir esta línea en una posición tal manera que este JAVA_OPTS se transfiere a cualquiera de comando _EXECJAVA al final del archivo (si-else anidado). Yo personalmente escribo esta línea como la primera declaración de este lote

+0

Los desarrolladores de Tomcat recomiendan mantener sus personalizaciones separadas. Utilice el archivo "% CATALINA_BASE% \ bin \ setenv.bat" para establecer las variables en lugar de modificarlas dentro de "catalina.bat". – naXa

Cuestiones relacionadas