web-dev-qa-db-fra.com

Erreur de l'espace PermGen dans tomcat

Je travaille dans l'environnement Windows. Et je reçois cette erreur à chaque fois que je travaille avec Tomcat-

Apr 30, 2012 5:30:37 PM org.Apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet default threw exception
Java.lang.OutOfMemoryError: PermGen space
2012-04-30 17:30:37.719 INFO net.spy.memcached.MemcachedConnection:  Connection state changed for Sun.nio.ch.SelectionKeyImpl@4ae53a99
2012-04-30 17:30:37.719 INFO net.spy.memcached.MemcachedConnection:  Reconnecting due to failure to connect to {QA sa=localhost/127.0.0.1:11211, #Rops=0, #Wops=0, #iq=0, topRop=null, topWop=null, toWrite=0, interested=0}
Java.net.ConnectException: Connection refused: no further information
Apr 30, 2012 5:30:37 PM org.Apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet default threw exception
Java.lang.OutOfMemoryError: PermGen space
Exception in thread "Memcached IO over {MemcachedConnection to localhost/127.0.0.1:11211}" Java.lang.OutOfMemoryError: PermGen space
Apr 30, 2012 5:30:38 PM org.Apache.coyote.http11.Http11Processor process
SEVERE: Error processing request
Java.lang.OutOfMemoryError: PermGen space
Apr 30, 2012 5:30:38 PM org.Apache.coyote.http11.Http11Processor process
SEVERE: Error processing request
Java.lang.OutOfMemoryError: PermGen space
Apr 30, 2012 5:30:38 PM org.Apache.coyote.http11.Http11Processor process
SEVERE: Error processing request
Java.lang.OutOfMemoryError: PermGen space
Apr 30, 2012 5:30:41 PM org.Apache.catalina.connector.CoyoteAdapter service
SEVERE: An exception or error occurred in the container during the request processing
Java.lang.OutOfMemoryError: PermGen space
Apr 30, 2012 5:30:43 PM org.Apache.catalina.core.StandardHostValve custom
SEVERE: Exception Processing ErrorPage[exceptionType=Java.lang.Throwable, location=/error.action]
Java.lang.OutOfMemoryError: PermGen space
Apr 30, 2012 5:30:42 PM org.Apache.catalina.core.StandardHostValve custom
SEVERE: Exception Processing ErrorPage[exceptionType=Java.lang.Throwable, location=/error.action]
Java.lang.OutOfMemoryError: PermGen space
Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" Java.lang.OutOfMemoryError: PermGen space

J'ai essayé d'ajouter Java_OPTS with the value as -Xms1024m -Xmx1024m dans les variables système, mais je reçois toujours la même erreur (Java.lang.OutOfMemoryError: espace PermGen) encore et encore. Toute aide serait appréciée. J'ai également lu d'autres articles dans stackoverflow également, mais cela n'a pas fonctionné.

53
AKIWEB

Tomcat utilise l’espace PermGen pour stocker les définitions de classe (uniquement les définitions, pas d’instanciations) et les pools de chaînes qui ont été internés. Par expérience, les problèmes d’espace PermGen ont tendance à se produire fréquemment dans les environnements de développement puisque Tomcat doit charger de nouvelles classes à chaque fois qu’il déploie un fichier WAR ou effectue un jspc (lorsque vous modifiez un fichier jsp). Personnellement, j'ai tendance à beaucoup déployer et redéployer les guerres lorsque je suis en test de développement, alors je sais que je vais devoir m'épuiser tôt ou tard (principalement parce que les cycles de GC de Java sont toujours un peu merdiques, donc si vous redéployez vos guerres rapidement et fréquemment. assez, l’espace se remplit plus vite qu’ils ne peuvent le gérer).

Cela devrait théoriquement être moins un problème dans les environnements de production puisque vous (espérons-le) ne changez pas la base de code toutes les 10 minutes. Si cela se produit toujours, cela signifie simplement que votre base de code (et les dépendances correspondantes de la bibliothèque) sont trop volumineuses pour l’allocation de mémoire par défaut et que vous aurez simplement besoin de vous embrouiller avec l’allocation de pile et de tas. Je pense que les normes sont des choses comme: 

-XX:MaxPermSize=SIZE

Cependant, j’ai trouvé que le meilleur moyen de s’occuper de cela de manière permanente est de permettre aux classes d'être déchargées afin que votre PermGen ne soit jamais épuisé:

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled

Des trucs comme ça ont fonctionné magiquement pour moi dans le passé. Une chose, cependant, il ya un compromis de performance important dans leur utilisation, puisque permgen balayages produiront deux demandes supplémentaires pour chaque demande que vous ferez ou quelque chose du genre. Vous devrez équilibrer votre utilisation avec les compromis.

107
Michael

Vous devez allouer plus d'espace au PermGenSpace de la JVM de Tomcat.

Cela peut être fait avec l’argument JVM: -XX: MaxPermSize = 128m

Par défaut, l'espace PermGen est de 64 Mo (et il contient toutes les classes compilées, donc si vous avez beaucoup de jar (classes) dans votre chemin de classe, vous pouvez effectivement remplir cet espace).

Par ailleurs, vous pouvez surveiller la taille de l’espace PermGen avec JVisualVM et vous pouvez même en inspecter le contenu avec YourKit Java Profiler

17
SRG

Pour compléter la réponse de Michael, et selon cette réponse , un moyen sûr de traiter le problème consiste à utiliser les arguments suivants:

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled -XX:+UseConcMarkSweepGC
10
Rafael

Si Tomcat est exécuté en tant que service Windows, ni CATALINA_OPTS ni Java_OPTS ne semblent avoir d'effet.

Vous devez le définir dans les options Java de l'interface graphique.

Le lien ci-dessous explique bien

http://www.12robots.com/index.cfm/2010/10/8/Giving-more-memory-to-the-Tomcat-Service-in-Windows

5
user2484733

Dans Tomcat 7.0, Windows Service Installer Version.Il n’ya pas catalina.bat dans/bin . Vous devez donc ouvrir Tomcat7w.exe dans/bin et ajouter un argument JVM

-XX:PermSize=256m -XX:MaxPermSize=512m

sur Java Option dans Java Tab, comme ça. Vous ajoutez également d'autres options.

 enter image description here

En outre, si vous utilisez IntellijIDEA, vous devez ajouter un argument JVM dans les configurations de serveur, comme ceci.

 enter image description here

2
saneryee

Le code de ligne de @AndreSmiley a fonctionné pour moi.

seule modification requise est.

-XX: MaxPermSize = 256 m

"m" signifie MB.

En fait, mon application est un peu énorme, donc on m'a conseillé de le faire 1024m pour la performance.

2
D V Santhosh Kiran

Celui-ci a fonctionné pour moi, dans startup.bat, la ligne suivante doit être ajoutée si elle n'existe pas set Java_OPTS avec la valeur -Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256. La ligne complète:

set Java_OPTS=-Dfile.encoding=UTF-8 -Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256
2
AndrewSmiley

J'exécute Tomcat7 sur CentOS 6.6. J'ai essayé de créer un nouveau fichier /usr/share/Tomcat/bin/setenv.sh et de définir à la fois Java_OPTS et CATALINA_OPTS. Mais Tomcat ne prendrait pas les valeurs au redémarrage. Quand je mets la ligne suivante dans /etc/Tomcat/tomcat.conf:

CATALINA_OPTS="-Xms128m -Xmx1024m -XX:MaxPermSize=1024m"

Tomcat a pris la nouvelle variable d'environnement. J'ai vérifié cela en courant

ps aux | grep Tomcat

et voir les nouveaux paramètres dans la sortie. Cela a pris beaucoup de temps à diagnostiquer et je n'ai vu personne d'autre le suggérer, alors j'ai pensé le jeter à la communauté Internet.

1
Barry H

Si vous utilisez Eclipse avec Tomcat, suivez les étapes ci-dessous.

  1. Sur la fenêtre du serveur Double-cliquez sur Tomcat pour ouvrir la fenêtre de présentation de Tomcat.

  2. Dans la fenêtre de présentation, vous trouverez Ouvrir la configuration de lancement sous Informations générales et cliquez sur Ouvrir la configuration de lancement.

  3. Dans la fenêtre d'édition de configuration, recherchez Arguments et cliquez dessus.
  4. Dans la balise arguments, recherchez VM arguments.
  5. collez simplement ceci -Xms256m -Xmx512m -XX: PermSize = 256m -XX: MaxPermSize = 512m à la fin des arguments. 

 edit launch configuration properties

J'ai essayé la même chose sur Intellij Ideav11.

Il ne récupérait pas les paramètres après avoir vérifié le processus à l'aide de grep . Dans le cas contraire, indiquez les paramètres mem pour Java_OPTS dans catalina.sh.

0
Sujal Shelke