Quelle implémentation libre de JVM offre la meilleure prise en charge de PermGen?

StackOverflow https://stackoverflow.com/questions/1009042

  •  06-07-2019
  •  | 
  •  

Question

J'utilise Tomcat6 dans la JRE6 de Sun et chaque couple déployé, je reçois OutOfMemoryException: PermGen. J'ai étudié les solutions de recherche de PermGen sur Google et essayé de nombreuses corrections. Aucun travail. J'ai lu beaucoup de bonnes choses sur JRockit d'Oracle et sur la façon dont son allocation PermGen peut être de taille (comparée à 128M de Sun) et bien que cela ne résolve pas le problème, cela me permettrait de redéployer 100 fois entre les exceptions PermGen par rapport à 2 fois maintenant.

Le problème avec JRockit est de l’utiliser en production pour pouvoir acheter WebLogic, qui coûte des milliers de dollars. Quelles autres options (gratuites) existent-elles qui pardonnent davantage l'expansion de PermGen? Comment les machines virtuelles ci-dessous font-elles dans ce domaine?

  • JVM IBM
  • Ouvrir JDK
  • Blackdown
  • Kaffe

... d'autres?

Mise à jour: Certaines personnes m'ont demandé pourquoi je pensais que PermGen max était 128M. La raison en est que chaque fois que j'essaie de l'élever au-dessus de 128 Mo, ma JVM ne parvient pas à s'initialiser:

[2009-06-18 01:39:44] [info] Une erreur s'est produite lors de l'initialisation de la machine virtuelle. [2009-06-18 01:39:44] [info] Impossible de réserver suffisamment d'espace pour le tas d'objets [2009-06-18 01:39:44] [395 javajni.c] [erreur] Échec de la création de Java Java

Il est étrange qu'il ne réussisse pas à essayer de réserver de l'espace pour l'objet heap , même si je ne suis pas sûr qu'il s'agisse du """ tas au lieu de " un " tas.

J'amorce la machine virtuelle Java avec 1024 Mo de initial et 1536 Mo de segment de mémoire maximum.

Je vais fermer cette question car elle a été répondue, c'est-à-dire. "Changer n'est pas utile" et demandez plutôt Pourquoi ma machine virtuelle Java Sun échoue-t-elle avec des paramètres PermGen plus importants?

Était-ce utile?

La solution

Je suis d'accord avec Michael Borgwardt sur le fait que vous pouvez augmenter la taille de PermGen. Je ne suis pas d'accord sur le fait que cela est principalement dû aux fuites de mémoire. L'espace PermGen est consommé de manière agressive par les applications mettant en œuvre une utilisation intensive de Reflection. En résumé, si vous avez une application Spring / Hibernate exécutée dans Tomcat, soyez prêt à augmenter considérablement l’espace PermGen.

Autres conseils

Qu'est-ce qui vous a donné l'idée que la machine virtuelle Java de Sun est limitée à 128 M PermGen? Vous pouvez le définir librement avec l'option de ligne de commande -XX: MaxPermSize; la valeur par défaut est 64 M.

Cependant, la cause réelle de votre problème est probablement une fuite de mémoire dans votre application qui empêche les classes de se faire ramasser. Celles-ci peuvent être très subtiles, en particulier lorsque les ClassLoaders sont impliqués, car il suffit d'une référence unique à n'importe laquelle des classes, n'importe où. Cet article décrit le problème en détail et celui-ci suggère des solutions pour y remédier.

Techniquement, le "PermGen" le pool de mémoire est une chose JVM de Sun. Les autres machines virtuelles ne l'appellent pas ainsi, mais elles ont toutes l'idée d'un ou de plusieurs pools de mémoire autres que des tas.

Mais si vous rencontrez un problème de permgen dans votre machine virtuelle Sun, il est très peu probable que vous changiez de machine virtuelle, cela se manifestera simplement sous un autre nom.

Si plusieurs redéploiements sont à l'origine de vos problèmes, augmentez simplement PermGen de la machine virtuelle jusqu'à atteindre de grandes valeurs. Nous avons essayé JRockit il y a quelque temps à cause de ce problème et il souffre du même épuisement dû au redéploiement. Nous sommes revenus à la machine virtuelle SUn.

Changer de machine virtuelle n'est pas une panacée. Vous pouvez obtenir de nouveaux problèmes inattendus (voir par exemple un article sur le lancement d’une application sous 4 machines JVM différentes).

  • Vous pouvez avoir une fuite de classe (par exemple via des chargeurs de classe) qui survient souvent lors du redéploiement. Franchement, je n'ai jamais vu de redéploiement à chaud sur Tomcat (j'espère le voir un jour).
  • Vous pouvez avoir des paramètres JVM incorrects (par exemple, le commutateur Sun JDK 6 64 bits -XX: + UseParNewGC entraîne la perte du segment de mémoire PermGen. Si vous ajoutez des commutateurs supplémentaires: -XX: + UseConcMarkSweepGC -XX: + CMSClassUnloadingEnabled-XX: + CMSPermGenSweepingEnabled la situation sera résolue. Drôle, mais je n’ai jamais rencontré la fuite susmentionnée avec Sun JDK 6 32 bits). Lien vers un article " Optimisation de la collecte des ordures JVM pour les déploiements de production " .
  • Votre bloc PermGen peut ne pas suffire pour charger des classes et des informations connexes (en fait, cela se produit le plus souvent après un redéploiement sous Tomcat, les anciennes classes restent en mémoire et les nouvelles se chargent)

De mon expérience passée, le débogage de ce type de fuite est l’un des types de débogage les plus délicats que je n’ai jamais eu.

[MISE À JOUR]

Article utile Comment éliminer le lien de chargeur de classe lors du redéploiement d'une application.

J'utilise JRockit et j'obtiens toujours des erreurs PermGen si je ne bosse pas la mémoire (via -XX: MaxPermSize). De plus, je ne peux rien faire pour éviter cela (à part l’augmenter).

Perm gen est probablement la mémoire la plus simple à gérer. Je doute qu'il y ait une grande différence entre les différentes implémentations de VM.

Assurez-vous que toutes les configurations de Tomcat qui sont marquées comme étant désactivées en production le sont également.

Oui, certains frameworks génèrent beaucoup de classes à la volée, mais ils devraient être nettoyés après eux-mêmes et, dans tous les cas, vous pouvez adapter plus de quelques classes à 128 Mo.

Sérieusement, si la perméabilité continue à monter, c’est une fuite qui devrait être réparée, même si ce n’est peut-être pas votre problème à résoudre.

La la machine virtuelle Java IBM ne le fait pas (et ne l'a pas 2009) ont un permgen. Vous pouvez en savoir plus sur son Collecteur de déchets générationnel simultané , qui correspond au catalogue global par défaut pour Java 7.

J'ai parfois exécuté l'EDI Eclipse sur une machine virtuelle IBM spécialement parce qu'avec mes plugins préférés, il remplissait fréquemment la permen de la machine virtuelle HotSpot. Bien sûr, il y avait probablement une fuite de mémoire que quelqu'un aurait dû réparer, mais entre-temps, mon IDE ne plantait pas et je n'étais pas occupé à expérimenter avec différents paramètres.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top