web-dev-qa-db-fra.com

que faire avec l'espace Tomcat PermGen

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)
26
SKing7

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
34
Scott Linford

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

13
Sourav Bairagi

POUR Eclipse

  1. Aller aux propriétés du serveur
  2. Aller à la plate-forme
  3. Maintenant, dans l'argument VM, écrivez ceci - Xms256m -Xmx256m -XX: PermSize = 256m -XX: MaxPermSize = 512m

POUR LES NETBEANS

  1. Allez dans le dossier Netbeans/etc /
  2. ouvrir netbeans.config dans n’importe quel éditeur
  3. éditer cette ligne comme

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

6
SUDARSHAN BHALERAO

réglage comme ceci:

-Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256m

enter image description here

5
foobarfuu

Juste pour ajouter pour Windows, si quelqu'un est toujours bloqué: -

  1. Ouvrir le fichier catalina.bat (situé dans le dossier d’installation d’Apache Tomcat/bin)
  2. 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

  3. Redémarrez Tomcat et c'est fait. 

Vous pouvez trouver une bonne explication ici

1
Nicks

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.

0
Purushothaman

Il suffit de le configurer depuis l'interface Apache Tomcat:

  1. démarrez C:\Program Files\Apache Software Foundation\Tomcat 8.5\bin\Tomcat8w.exe (ou vous pouvez simplement lancer une recherche dans Windows pour "Configure Tomcat");
  2. Aller à l'onglet Java;
  3. Définissez l'espace requis dans les champs de saisie:  enter image description here
0
BabaNew