Tomcat : comment gérer l'erreur de dépassement de mémoire java.lang.OutOfMemoryError: PermGen space ?
Lorsque vous faites énormément de compilations de programmes lors de l'exécution, il peut se produire une erreur de type OutOfMemory.
Le serveur Tomcat est le serveur le plus utilisé lorsque l'on développe des applications Web Java. Lorsque vous faites énormément de compilations de programmes lors de l'exécution, il peut se produire une erreur de type OutOfMemory. Le message d'erreur affiché sera java.lang.OutOfMemoryError: PermGen space failure. Cette erreur résulte des nombreuses compilations faites par la machine virtuelle Java (JVM).
Certaines bibliothèques Java, ou certains éléments du programme, remplissent la mémoire mais ces traces ne sont pas nettoyées et se retrouvent même après un redémarrage de Tomcat. Par conséquent la mémoire devient trop pleine et il est impossible pour Tomcat de démarrer une application Web.
Pour corriger le problème responsable de cette erreur, il faut ajouter des paramètres de démarrage à la machine virtuelle Java. Pour effectuer cette modification, il faut éteindre Tomcat et aller dans son répertoire, puis dans le sous-répertoire bin. Une fois dans ce répertoire, il faut exécuter le fichier tomcat6w.exe (sous Windows). Ce fichier ouvre une fenêtre permettant de configurer Tomcat comme un service.
Dans le champ Options Java, ajoutez ces deux options à la ligne de commande :
-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
Validez la fenêtre et redémarrez le service. Ces deux options indiquent à la machine virtuelle Java qu'elle doit supprimer de sa mémoire les classes Java qui sont habituellement conservées. Elles n'occupent normalement que peu de mémoire mais cela peut vite prendre du volume avec certaines bibliothèques et aboutir à une erreur d'exécution des applications web.
Si, lorsque vous relancez Tomcat, vous obtenez un message d'erreur indiquant que le service spécifié n'existe pas, alors il faut utilisez la commande suivante :
tomecat6w //ES//nomDuService //nomDuService se trouve dans le fichier services.msc.