PermGen space Erreur 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 j'obtiens toujours la même erreur (java.lang.OutOfMemoryError: PermGen space) encore et encore. Toute aide sera appréciée. J'ai également lu d'autres post dans stackoverflow aussi, mais il n'a pas fonctionné.

53
demandé sur Visruth 2012-05-01 04:43:51

11 réponses

L'espace PermGen est ce que Tomcat utilise pour stocker les définitions de classes (définitions seulement, pas d'instanciations) et les pools de chaînes qui ont été internés. D'expérience, les problèmes D'espace PermGen ont tendance à se produire fréquemment dans les environnements dev car Tomcat doit charger de nouvelles classes chaque fois qu'il déploie une guerre ou fait un jspc (lorsque vous éditez un fichier jsp). Personnellement, j'ai tendance à déployer et à redéployer les guerres beaucoup quand je suis dans les tests de développement Donc je sais que je suis lié à s'épuiser tôt ou tard (principalement parce que les cycles GC de Java sont toujours un peu merdiques donc si vous redéployez vos guerres assez rapidement et fréquemment, l'espace se remplit plus vite qu'ils ne peuvent gérer).

cela devrait théoriquement poser moins de problèmes dans les environnements de production puisque vous (avec un peu de chance) ne changez pas la base de code sur une base de 10 minutes. Si cela se produit encore, cela signifie simplement que votre base de code (et les dépendances correspondantes de la bibliothèque) sont trop grandes pour l'allocation de mémoire par défaut et vous aurez juste besoin de Messer autour avec stack et allocation de tas. Je pense que les normes sont des trucs comme:

-XX:MaxPermSize=SIZE

j'ai trouvé cependant la meilleure façon de prendre soin de cela pour de bon est de permettre aux classes d'être déchargées de sorte que votre PermGen ne s'épuise jamais:

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled

des trucs comme ça ont fait de la magie pour moi dans le passé. Une chose tho, il y a un compromis de performance important dans l'utilisation de ceux-ci, puisque permgen sweeps fera comme 2 demandes supplémentaires pour chaque demande que vous faites ou quelque chose le long de ces lignes. Vous aurez besoin d'équilibrer votre utilisation avec les compromis.

107
répondu Michael 2012-05-01 01:06:49

vous devez allouer plus d'espace au PermGenSpace de la JVM tomcat.

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

par défaut, L'espace PermGen est de 64M (et il contient toutes les classes compilées, donc si vous avez beaucoup de jar (classes) dans votre classpath, vous pouvez en effet remplir cet espace).

sur une note latérale, vous pouvez surveiller la taille de L'espace PermGen avec JVisualVM et vous pouvez même inspecter son contenu avec YourKit Java Profiler

17
répondu SRG 2012-05-01 00:57:52

pour compléter la réponse de Michael, et selon cette réponse , une façon sûre de traiter le problème est d'utiliser les arguments suivants:

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled -XX:+UseConcMarkSweepGC
10
répondu Rafael 2017-05-23 11:46:51

si tomcat tourne sous Windows Service, ni CATALINA_OPTS ni JAVA_OPTS ne semblent avoir d'effet.

vous devez le définir dans les options Java dans GUI.

le lien ci-dessous l'explique bien

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

5
répondu user2484733 2014-09-26 08:19:15

Cela 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
répondu AndrewSmiley 2015-06-29 14:02:30

Dans Tomcat 7.0 Service Windows Installer Version.Il n'y a pas de catalina.chauve-souris dans /bin . Si vous avez besoin de l'ouvrir Tomcat7w.exe dans /bin et ajouter coup argument JVM

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

sur L'Option Java dans L'onglet Java, comme ceci. Vous pouvez également ajouter d'autres options.

enter image description here

un autre, si vous utilisez IntellijIDEA, vous devez ajouter un argument JVM dans les Configurations de serveur,comme ceci.

enter image description here

2
répondu saneryee 2015-12-18 07:44:15

@AndreSmiley le code de la ligne a fonctionné pour moi.

seule la modification requise est.

- XX: MaxPermSize=256 m

"m" signifie MO.

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

2
répondu D V Santhosh Kiran 2016-04-21 18:58:09

je lance tomcat7 sur CentOS 6.6. J'ai essayé de créer un nouveau /usr/share/tomcat/bin/setenv.sh classer et définir à la fois JAVA_OPTS et CATALINA_OPTS . Mais tomcat ne récupérait 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 capté la nouvelle variable d'environnement. J'ai vérifié en lançant

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 suggérer cela, donc j'ai pensé que j'allais le jeter à la communauté internet.

1
répondu Barry H 2016-02-05 09:40:21

si vous utilisez eclipse avec tomcat, suivez les étapes ci-dessous.""
  1. sur la fenêtre du serveur Double-cliquez sur tomcat, il ouvrira la fenêtre d'aperçu de tomcat .

  2. Dans la fenêtre d'Aperçu, 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 cherche VM arguments .
  5. simplement coller ceci - Xms256m-Xmx512m-XX:PermSize=256m-XX:MaxPermSize=512m à la fin des arguments.

edit launch configuration properties

1
répondu Mohammed Irfan Tirupattur 2016-07-05 07:31:04

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

il ne récupérait pas les réglages après avoir vérifié le processus en utilisant grep. Dans le cas contraire, donnez les paramètres mem pour JAVA_OPTS dans catalina.sh a la place.

0
répondu Sujal Shelke 2018-03-08 19:52:07

tuer le processus tomcat (avec force, tuer -9 pour Linux) et recommencer résout le problème. À mon avis, l'instance tomcat ne se fait pas tuer correctement en utilisant shutdown.chauve. Donc, nous devons tuer le processus avec force et recommencer.

-5
répondu RocketScience 2014-05-02 19:26:42