PermGen problèmes avec Ascenseur et Jetée
Je suis en cours de développement sur le standard de la plate-forme d'Ascenseur (maven et de la jetée). Je suis à plusieurs reprises (une fois tous les deux jours) obtenir ceci:
Exception in thread "7048009@qtp-3179125-12" java.lang.OutOfMemoryError: PermGen space
2009-09-15 19:41:38.629::WARN: handle failed
java.lang.OutOfMemoryError: PermGen space
C'est dans mon environnement de dev. Ce n'est pas un problème parce que je peux garder le redémarrage du serveur. En déploiement, je ne suis pas avoir ces problèmes, il n'est donc pas un réel problème. Je suis juste curieux.
Je ne sais pas trop à propos de la JVM. Je pense que je suis correct en pensant que la génération permanente de la mémoire est pour des choses comme les classes et les internés des chaînes? Ce dont je me souviens est de mélanger un peu avec la .NET modèle de mémoire...
Aucune raison pourquoi ce qui se passe? Sont les valeurs par défaut juste follement bas? Est-il à faire avec tous les auxiliaires des objets que la Scala a créer pour la Fonction des objets et similaires FP choses? Chaque fois que je redémarre une Jetée et un code nouvellement écrit (de quelques minutes), j'imagine qu'il re-charges classes, etc. Mais même ainsi, il ne peut être que de nombreux peut-il? Et ne pas le JVM être en mesure de traiter un grand nombre de classes?
Acclamations
Joe
- Comme indiqué dans le web.archive.org/web/20150105090518/http://www.scala-blogs.org/... l'article: "La JVM générationnel garbage collector est optimisé pour des situations de ce genre, et parce que la implicitement les objets créés sont de courte durée, ils GC très bien.". mais si ces objets ne sont pas de courte durée, c'est une autre histoire.
Vous devez vous connecter pour publier un commentaire.
De ce post:
-XX:+CMSClassUnloadingEnabled
: ce paramètre permet de collecte des ordures dans la permgenspace-XX:+CMSPermGenSweepingEnabled
: permet le garbage collector pour enlever même les classes à partir de la mémoire-XX:PermSize=64M -XX:MaxPermSize=128M
: soulève la quantité de mémoire allouée à la permgenspacePeut-être que cela pourrait aider.
Edition juillet 2012 (près de 3 ans plus tard):
Ondra Žižka commentaires (et j'ai mis à jour la réponse ci-dessus):
CMSClassUnloadingEnabled
(Si la classe de déchargement activé lors de l'utilisation de CMS GC)CMSPermGenSweepingEnabled
dans l'avenirVoir l'intégralité de l' Hotspot Options JVM - La référence complète de manière plus.
CMSClassUnloadingEnabled
en place deCMSPermGenSweepingEnabled
dans l'avenir.Si vous voyez cette lors de l'exécution de
mvn jetty:run
,définir la
MAVEN_OPTS
.Pour Linux:
Pour Windows:
Devrait être bon maintenant. Si pas, augmenter
-XX:MaxPermSize
.Vous pouvez aussi mettre ces en permanence à votre environnement.
Pour Linux, ajouter le
export
ligne~/.bashrc
Pour Windows, appuyez sur
Win-key + PrintScreen
, et allerAdvanced > Environment
.Voir aussi http://support.microsoft.com/kb/310519.
C'est parce que le rechargement des classes comme vous l'avez suggéré. Si vous utilisez beaucoup de bibliothèques, etc. la somme des classes de croître rapidement et à chaque redémarrage. Essayez de surveiller votre jetée exemple avec VisualVM pour obtenir une vue d'ensemble de la consommation de mémoire lors du rechargement.
La liste de diffusion (http://groups.google.com/group/liftweb/) est le forum de support officiel pour l'Ascenseur, et où vous serez en mesure d'obtenir une meilleure réponse. Je ne connais pas les détails de votre dev d'installation (vous n'allez pas dans les détails), mais je suppose que vous êtes le rechargement de votre guerre Jetée sans redémarrer. L'ascenseur ne fonctionne plus dynamique de génération de classe (comme suggéré par VonC ci-dessus), mais Scala compile chaque fermeture d'une classe à part. Si vous êtes l'ajout et la suppression des fermetures de votre code au cours de plusieurs jours, il est possible que trop de nombreuses classes sont en cours de chargement et de ne jamais déchargé et prise de perm de l'espace. Je vous suggérons d'activer les options de la JVM options mentionnées par les VonC ci-dessus et de voir si elles vous aider.
La génération permanente est où la JVM met des trucs qui ne devraient pas l'être (poubelle) recueillies sur mesure chargeurs de classes.
En fonction de ce que vous déployez, la perm gen paramètre peut être faible. Certaines applications et/ou les conteneurs combinaison ne contiennent quelques fuites de mémoire, de sorte que quand une application déployée. parfois certains trucs comme la classe, les chargeurs ne sont pas collectées, résultant dans le remplissage de la Perm de l'Espace ainsi générer l'erreur que vous rencontrez.
Malheureusement, actuellement la meilleure option dans ce cas est de max la perm de l'espace avec la jvm suivant drapeau (exemple pour 192m perm taille):
L'autre option est de s'assurer que le conteneur ou le cadre ne sont pas de fuite de mémoire.