2010-08-27 3 views
6

J'ai un Tomcat6 en cours d'exécution sur une machine Windows2003. J'ai déployé 2 applications Grails sur ce serveur et j'ai vite remarqué que tout se bloque quelque temps après le déploiement avec une erreur classique de PermGen.Comment vous assurer que Tomcat6 lit CATALINA_OPTS sous 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 
... 

donc j'ai trouvé une solution commune pour ce problème: tas et de plus en plus l'espace PermGen avec:

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

Ajouté dans C: \ apache-tomcat-6.0.26 \ bin \ catalina.bat. Malheureusement, cela n'a pas fonctionné, mais le problème est que je ne suis pas sûr que Tomcat le prenne en charge. J'ai vérifié divers journaux mais ces options ne sont jamais imprimées. Existe-t-il un moyen de les enregistrer et de s'assurer que Tomcat les a lues?

EDIT: J'ai essayé d'ajouter les options JVM suivantes avec tomcat6w.exe:

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

Et rien changé. Je reçois un permGen après 2-3 minutes de disponibilité. Une autre idée?

À la votre! Mulone

+0

Quels java vm utilisez-vous? – Joelio

+0

Bon point: C: \ Programmes \ Java \ jdk1.6.0_19 \ jre \ bin \ server \ jvm.dll – Mulone

+0

Ce genre de question est pour serverfault.com, je suppose. – Ither

Répondre

6

Merci à tous! Je finalement résolu le problème en ajoutant:

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

Pour les options java sur tomcat6w.exe.

Merci!

0

Regardez où vous mettez il, utilisez echo [statements] pour résoudre, essayez de régler juste avant son passé à la machine virtuelle, quelque chose comme:

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% 

Assurez-vous que vous avez le droit EXEC_JAVA pas sûr de la version du fichier .bat que vous avez, mais probablement plusieurs instructions if.

Assurez-vous également que ces arguments sont valides pour votre machine virtuelle.

Vous pouvez vérifier votre taille de tas max dans votre code java, utilisez:

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

Il suffit de l'imprimer, si son correct en fonction de vos paramètres, vous avez une mauvaise fuite de mémoire, si son pas, tomcat ne le ramasse pas.

1

En fait, je mis les JAVA_OPTS comme pour ma machine virtuelle Java avant de démarrer le serveur

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

façon réelle de le faire (en catalina.bat),

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

ajouter cette ligne dans une telle position pour que ce JAVA_OPTS est transféré à une commande de _EXECJAVA à la fin du fichier (si-else imbriqué). J'écris personnellement cette ligne comme première déclaration de ce lot

+0

Les développeurs Tomcat recommandent de séparer vos personnalisations. Utilisez le fichier "% CATALINA_BASE% \ bin \ setenv.bat" pour définir les variables au lieu de les modifier dans "catalina.bat". – naXa

Questions connexes