54 votes

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é.

107voto

Michael Points 1254

Le PermGen space est ce que Tomcat utilise pour stocker les définitions de classe (définitions, pas seulement les instanciations) et de la chaîne de piscines qui ont été internés. Par expérience, la PermGen space problèmes ont tendance à se produire fréquemment dans les environnements de dev vraiment depuis Tomcat a charger de nouvelles classes à chaque fois qu'il déploie une GUERRE ou d'un jspc (lorsque vous modifiez un fichier jsp). Personnellement, j'ai tendance à déployer et redéployer les guerres beaucoup quand je suis en dev test donc je sais que je suis lié à manquer tôt ou tard (surtout à cause de Java GC cycles sont encore un peu la merde donc si vous redéployer vos guerres rapidement et assez fréquemment, l'espace se remplit plus vite qu'ils ne peuvent gérer).

Cela devrait, théoriquement, être moins un problème dans les environnements de production, puisque vous (je l'espère) ne pas modifier le code de base sur une période de 10 minutes. Si cela se produit, cela signifie simplement que votre base de code (et correspondant dépendances de la bibliothèque) est trop grande pour que la valeur par défaut de l'allocation de mémoire et vous aurez simplement besoin de se compliquer la vie avec la pile et le tas de répartition. Je pense que les normes sont des choses comme:

-XX:MaxPermSize=SIZE

J'ai trouvé cependant, la meilleure façon de prendre soin de ce bien est de permettre à des classes d'être déchargé pour votre PermGen ne s'épuise jamais:

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled

Des trucs comme ça, travaillé à de la magie pour moi dans le passé. Une chose tho, il y a un important compromis dans l'utilisation de ceux qui, depuis permgen balaie fera comme un supplément de 2 demandes pour chaque demande que vous faites ou quelque chose le long de ces lignes. Vous aurez besoin pour l'équilibre de votre utilisation avec les avantages et les inconvénients.

17voto

SRG Points 796

Vous devez allouer plus d'espace pour les PermGenSpace de l'tomcat JVM.

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

Par défaut, le PermGen space est 64M (et il contient toutes les classes compilées, donc si vous avez beaucoup de pot (classes) dans votre classpath, vous peut en effet remplir cet espace).

Sur une note de côté, vous pouvez contrôler la taille de la PermGen space avec JVisualVM et vous pouvez même examiner son contenu avec YourKit Java Profiler

10voto

Rafael Points 320

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
 

5voto

user2484733 Points 1

Si tomcat est exécuté en tant que service Windows, ni CATALINA_OPTS ni JAVA_OPTS ne semblent avoir aucun 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

-5voto

RocketScience Points 9

Tuer le processus tomcat (avec force, kill -9 pour Linux) et le redémarrer résout le problème. À mon avis, l'instance de tomcat n'est pas détruite correctement à l'aide de shutdown.bat. Nous devons donc éliminer le processus par la force et recommencer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X