2009-08-20 6 views
4

Je développe des applications web et j'utilise jBoss 4.0.2 et quand j'ai redéployé plusieurs fois WAR avec eclipse, jBoss va planter parce qu'il manque de mémoire. Et quand je dois installer une nouvelle version dans l'environnement de production, il faudra consommer de la mémoire des serveurs de production, ce qui signifie que je dois arrêter jBoss pour empêcher le redéploiement de la mémoire du serveur client. Y a-t-il du travail pour ce problème?jBoss 4.0.2 déployer plusieurs fois le même WAR provoque le crash de jBoss à cause des erreurs PermGem/Out-of-Memory

Répondre

5

Fondamentalement, non. En raison du fonctionnement des classloaders JBoss, chaque déploiement utilisera un morceau de PermGen qui ne sera pas publié même si l'application n'est pas déployée.

Vous pouvez atténuer les symptômes en augmentant la taille du pool de mémoire PermGen à plusieurs centaines de megs (ou même des concerts), ce qui rend le problème plus facile à vivre. J'ai également constaté que la réduction de l'utilisation de champs statiques dans votre code (en particulier les champs statiques qui se réfèrent à des objets volumineux) réduit l'impact sur PermGen.

Idéalement, je n'utiliserais pas de déploiement à chaud en production, mais je ferais plutôt fermer le serveur, remplacer le fichier WAR/EAR, puis le redémarrer.

0

Je ne suis pas sûr que ce soit lié, mais je le soupçonne - JBoss n'est pas compatible J2EE en ce qui concerne la mise en œuvre de la séparation des applications car il sort de la boîte. Comme il vient, il ya un classloader dans lequel toutes les classes sont mises et donc il n'est pas possible de décharger des classes et donc vous allez avoir ce problème. Vous pouvez configurer jboss pour être plus conforme à J2EE à cet égard.

Obtenez-vous le "mémoire insuffisante Permgen" ou obtenez-vous régulièrement hors de la mémoire?

J'ai également progressé en connectant JProfiler et en vérifiant l'utilisation de la mémoire.

J'ai fini par simplement redémarrer Jboss tout le temps - n'a pas pris trop de temps.

0

Essayez ceci (qui applique à Java de Sun):

-XX: + UseConcMarkSweepGC -XX: + CMSPermGenSweepingEnabled -XX: + CMSClassUnloadingEnabled -XX: MaxPermSize = 128m

CMS peut réellement GC le tas de génération permanente (le tas où sont vos classes). La définition de MaxPermSize est inutile, mais la valeur par défaut est faible pour un serveur d'applications.