web-dev-qa-db-fra.com

Erreur d'espace PermGen - Glassfish Server

J'exécute Java application web utilisant Hibernate et glassfish Server. Je reçois

Java.lang.OutOfMemoryError: PermGen space exception quand après l'avoir déployé plusieurs fois.

J'ai essayé -XX:MaxPermSize=128M dans mes variables d'environnement, mais cela ne fonctionne pas.

31
devan

Il s'agit d'une fuite de mémoire du chargeur de classe. Chaque fois que vous redéployez l'application, un nouveau chargeur de classe est créé pour elle et toutes les classes de votre application sont à nouveau chargées. Cela consomme de la mémoire dans l'espace perm gen.

L'ancien chargeur de classe et toutes ses classes chargées doivent être récupérés, sinon vous finirez par exécuter dans un espace PermOME OOME après avoir déployé plusieurs fois. Cela ne fonctionne pas si un objet chargé par un chargeur de classe externe contient une référence à tout objet chargé par l'ancien chargeur de classe. Cet article donne une bonne explication du problème.

Généralement, les fuites du chargeur de classe sont difficiles à analyser et parfois difficiles à corriger. Pour savoir pourquoi les anciens chargeurs de classe ne sont pas récupérés, vous devez utiliser un profileur. Dans JProfiler , utilisez le marcheur de tas, sélectionnez les objets du chargeur de classe glassfish et utilisez la vue des références entrantes pour vérifier les chemins d'accès aux racines du récupérateur de place.

La classe du chargeur de classe s'appelle org.Apache.servlet.jasper.JasperLoader. Voici une capture d'écran d'une situation normale, où le chargeur de classe n'est détenu que par des instances actives d'objets chargés.

enter image description here

Dans votre situation, vous devriez voir des références d'objets extérieurs. Une autre cause courante de fuite de chargeur de classe dans les conteneurs Web est un thread d'arrière-plan qui n'est pas arrêté. Google Guice, par exemple, a un tel bogue dans 3.0.

(Avertissement: mon entreprise développe JProfiler)

38
Ingo Kegel

Pour résoudre ce problème (dans un système d'exploitation Linux), procédez comme suit

1) augmenter la mémoire (pour que ce problème ne se reproduise pas fréquemment) en configurant "domain.xml" dans

/ glassfish/domain/domain1/config

rechercher

<jvm-options>-XX:MaxPermSize=

set it to higher value eg- 198m or 256m

2) tuer le processus glassfish pour libérer le port sur lequel il s'exécutait (dans mon cas c'était 8686) ouvrir le terminal (sous os basé sur linux) et taper -

Sudo netstat -npl | grep 8686

cela se traduira par quelque chose comme ..

tcp6 0 0 :::8686 :::* LISTEN 3452/Java

prochaine utilisation

kill -9 3452 pour tuer ce processus (3452 dans ce cas)

Maintenant, essayez de démarrer Glassfish, il devrait commencer.

47
vkantiya

Si vous utilisez Windows, essayez de tuer le processus glassfish (Java.exe * 32) avec le Gestionnaire des tâches, puis redémarrez le serveur.

10
aviggiano

Ce problème se produit plusieurs fois avec le déploiement itératif. J'ai fait face à de nombreuses fois. Veuillez vous référer au lien JIRA ci-dessous pour le bug du poisson-verre:

http://Java.net/jira/browse/GLASSFISH-587

4
explorer