BACKGROUND: J'ai un projet Web qui utilise JSP. IDE est Eclipse . La configuration de Tomcat est la suivante: Publier automatiquement lorsque les ressources changent et que l'intervalle de publication est "1 seconde".
Un fichier de propriétés dans le dossier des classes qui permettait de sauvegarder certains paramètres. Il peut également être modifié dynamiquement par le servlet. L'opération de modification est déclenchée par le bouton Enregistrer du fichier JSP.
PROBLEM: Après plusieurs sauvegardes, Tomcat est livré avec Java.lang.OutOfMemoryError: PermGen space
.
LOG MESSAGE
Java.lang.OutOfMemoryError: PermGen space
at Java.lang.ClassLoader.defineClass1(Native Method)
at Java.lang.ClassLoader.defineClassCond(ClassLoader.Java:632)
at Java.lang.ClassLoader.defineClass(ClassLoader.Java:616)
at Java.security.SecureClassLoader.defineClass(SecureClassLoader.Java:141)
at org.Apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.Java:1815)
at org.Apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.Java:872)
at org.Apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.Java:1325)
at org.Apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.Java:1204)
at org.Apache.catalina.startup.WebAnnotationSet.loadApplicationServletAnnotations(WebAnnotationSet.Java:108)
at org.Apache.catalina.startup.WebAnnotationSet.loadApplicationAnnotations(WebAnnotationSet.Java:58)
at org.Apache.catalina.startup.ContextConfig.applicationAnnotationsConfig(ContextConfig.Java:297)
at org.Apache.catalina.startup.ContextConfig.start(ContextConfig.Java:1064)
at org.Apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.Java:261)
at org.Apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.Java:120)
at org.Apache.catalina.core.StandardContext.start(StandardContext.Java:4238)
at org.Apache.catalina.core.StandardContext.reload(StandardContext.Java:3083)
at org.Apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.Java:404)
at org.Apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.Java:1279)
at org.Apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.Java:1571)
at org.Apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.Java:1580)
at org.Apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.Java:1580)
at org.Apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.Java:1560)
at Java.lang.Thread.run(Thread.Java:662)
Tomcat a besoin de beaucoup de permgen. 512m n'est pas déraisonnable max. Cependant, cela ne fait que retarder la fuite à chaud. Permgen augmentera de ~ 25 Mo par hotdeploy, ce qui, dans Eclipse, pourrait être chaque fois que vous enregistrez un fichier Java. 512m disparaît rapidement si vous avez un commutateur comme Ctrl + S comme moi.
La solution: permettre à Java d’extraire de la mémoire les définitions de classe, c’est-à-dire du code octet à ordures. Ajoutez-les à votre taille de permgen boostée:
-XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC
Vous pouvez définir la variable d'environnement nommée: "Java_OPTS
" et en définir la valeur comme suit -Xms256m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m
POUR Eclipse
POUR LES NETBEANS
netbeans_default_options = "- Client J -J-Xss256m -J-Xms256m -J-XX: PermSize = 256m -XX: MaxPermSize = 512m -J-Dapple.laf.useScreenMenuBar = true -J-Dapple.awt. graphics.UseQuartz = true -J-Dsun.Java2d.noddraw = true -J-Dsun.Java2d.dpiaware = true -J-Dsun.Zip.disableMemoryMapping = true "
C'est tout
réglage comme ceci:
-Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256m
Juste pour ajouter pour Windows, si quelqu'un est toujours bloqué: -
Définissez Java_OPTS comme suit au tout début (avant sa première utilisation nulle part dans le fichier): -
set Java_OPTS = -Dfile.encoding = UTF-8 -Xms128m -Xmx1024m -XX: PermSize = 64m -XX: MaxPermSize = 256m
Redémarrez Tomcat et c'est fait.
Vous pouvez trouver une bonne explication ici
Le serveur Tomcat exécute différentes applications Java et Eclipse s'exécute dans différentes versions de Java
L'ajout de -XX:MaxPermSize=512m
à Eclipse.ini
aidera donc à résoudre ce problème. Suivez les étapes ci-dessous pour ajouter ceci au serveur Tomcat:
Double-cliquez sur le serveur dans Eclipse
configuration de lancement ouverte
ajoutez "-XX: MaxPermSize = 512m" aux arguments VM de l'onglet Arguments.
Il suffit de le configurer depuis l'interface Apache Tomcat: