44 votes

Comment réduire java simultanées mode de l'échec et de l'excès de gc

En Java, le simultanées en mode échec signifie que le simultanées collecteur a échoué à libérer suffisamment d'espace mémoire de forme permanents et permanents gen et a abandonner et de laisser le plein cessez-le-monde gc coups de pied dans. Le résultat final pourrait être très coûteux.

Je comprends ce concept, mais n'a jamais eu une bonne compréhension globale de
A) ce qui a pu provoquer un tel mode de défaillance et de
B) quelle est la solution?.

Ce genre de unclearness m'amène à écrire/déboguer le code sans trop de conseils à l'esprit, et souvent à la boutique autour de ces performances drapeaux de Toto à la Barre sans raison particulière, juste pour essayer.

Je voudrais savoir à partir de développeurs ici quelle est votre expérience? Si vous aviez rencontré ce genre de problème de performance, quelle en est la cause et comment vous vous êtes adressé à elle?

Si vous avez des recommandations relatives au codage, s'il vous plaît ne pas être trop général. Merci!

22voto

Kevin Lafayette Points 121

La première chose à propos de CMS que j'ai appris, c'est qu'il a besoin de plus de mémoire que les autres collectionneurs, à environ 25 à 50% de plus c'est un bon point de départ. Cela vous aide à éviter la fragmentation, depuis la CMS ne fait pas de compactage, comme l'arrêt le monde des collectionneurs. Deuxièmement, faire des choses qui aident le garbage collector; Entier.valueOf au lieu de new Integer, se débarrasser de l'anonymat de classes, assurez-vous que les classes internes ne sont pas accéder inaccessible choses (privé à l'extérieur de la classe) des trucs comme ça. Le moins de déchets le mieux. FindBugs et de ne pas ignorer les avertissements aidera beaucoup avec cela.

Aussi loin que l'accordage, j'ai trouvé que vous avez besoin d'essayer plusieurs choses:

-XX:+UseConcMarkSweepGC

Raconte JVM à l'utilisation du CMS poste d'enseignant permanent gen.

Fixer la taille de votre tas: -Xmx2048m -Xms2048m Cela empêche GC d'avoir à faire des choses comme grandir et rétrécir le tas.

-XX:+UseParNewGC

l'utilisation en parallèle plutôt qu'en série de la collection dans la jeune génération. Cela permettra d'accélérer votre mineur collections, surtout si vous avez un très grand jeune gen configuré. Un grand jeune génération est généralement bonne, mais ne pas aller plus de la moitié de l'ancienne gen taille.

-XX:ParallelCMSThreads=X

définir le nombre de threads que de la CMS doit utiliser lorsqu'il est en train de faire des choses qui peuvent être faites en parallèle.

-XX:+CMSParallelRemarkEnabled remarque est de série par défaut, ce qui peut accélérer votre travail.

-XX:+CMSIncrementalMode permet aux applications de fonctionner plus par pasuing GC entre les phases

-XX:+CMSIncrementalPacing permet JVM à la figure de changer la façon dont souvent il recueille au fil du temps

-XX:CMSIncrementalDutyCycleMin=X Minimm quantité de temps passé à faire du GC

-XX:CMSIncrementalDutyCycle=X de Commencer par faire du GC cette % du temps

-XX:CMSIncrementalSafetyFactor=X

J'ai trouvé que vous pouvez obtenir généralement faible temps de pause si vous le configurer de sorte que, fondamentalement, c'est toujours de la collecte. Puisque la plupart du travail est fait en parallèle, vous vous retrouvez avec essentiellement régulière prévisible des pauses.

-XX:CMSFullGCsBeforeCompaction=1

Celui-ci est très important. Il raconte l'CMS collector de toujours compléter la collection, avant de commencer un nouveau. Sans cela, vous pouvez exécuter dans la situation où il jette un tas de travail à l'écart et on recommence.

-XX:+CMSClassUnloadingEnabled

Par défaut, CMS permettra à votre PermGen croître jusqu'à ce qu'il tue votre application en quelques semaines à partir de maintenant. Cet arrêt. Votre PermGen ne serait croissant de bien que si vous faites usage de la Réflexion, ou abusent de la Chaîne.stagiaire, ou de faire quelque chose de mal avec un chargeur de classe, ou de quelques autres choses.

Survivant ratio et tenuring theshold peut aussi être joué avec, en fonction de si vous avez de longue ou de courte durée objets, et combien objet de copie entre la victime espaces, vous pouvez vivre avec. Si vous savez que tous vos objets vont rester dans les parages, vous pouvez configurer zéro de la taille d'survivant des espaces, et tout ce qui survit un jeune gen collection sera immédiatement titularisés.

12voto

fglez Points 4215

Cité de "Compréhension Simultanée Marque de Balayage Garbage Collector Journaux"

La concurrente de mode de défaillance peut soit être évité en augmentant le titulaire génération de la taille ou de l'initiation de la CMS lors d'une collecte de moindre tas d'occupation par la mise en CMSInitiatingOccupancyFraction pour un valeur inférieure

Cependant, s'il existe vraiment une fuite de mémoire dans votre application, vous êtes juste d'acheter du temps.

Si vous avez besoin de redémarrage rapide et de récupération et de préférer une "die fast' approche, je dirais ne pas utiliser le CMS à tous. Je m'en tiendrais à '-XX:+UseParallelGC'.

De "Garbage Collector "Ergonomie"

Le parallèle garbage collector (UseParallelGC) déclenche une de mémoire exception si une quantité excessive de temps est passé à recueillir une petite quantité de la tas. Pour éviter cette exception, vous pouvez augmenter la taille du tas. Vous pouvez aussi définir les paramètres -XX:GCTimeLimit=time-limit et -XX:GCHeapFreeLimit=space-limit

4voto

Stephen C Points 255558

Parfois OOM assez rapide et a été tué, parfois souffre de long gc période (la dernière fois était de plus de 10 heures).

Pour moi, ça ressemble à une fuite de mémoire est à la racine de vos problèmes.

Un CMS échec ne va pas (comme je le comprends) cause un OOM. Plutôt un CMS échec se produit parce que la JVM doit faire trop nombreuses collections trop rapidement, et la CMS ne pouvait pas suivre. Une situation où beaucoup de cycles de collecte se produire dans un court délai, c'est quand votre segment de mémoire est presque pleine.

Le long GC temps semble bizarre ... mais c'est théoriquement possible si votre machine a été volée horriblement. Toutefois, une longue période de la répétition des GCs est tout à fait plausible si votre segment de mémoire est presque pleine.

Vous pouvez configurer le GC d'abandonner, quand le tas est 1) au max de la taille et 2) toujours près de satiété après un full GC est terminé. Essayez de faire cela si vous ne l'avez pas déjà fait. Il ne guérira pas votre les problèmes, mais au moins votre JVM obtiendrez le OOM rapidement, permettant un service plus rapide redémarrage et la récupération.

MODIFIER - pour cela, l'option est - -XX:GCHeapFreeLimit=nnnnnn est un nombre entre 0 et 100 en donnant le pourcentage minimum de la masse, qui doit être libre après la GC. La valeur par défaut est 2. L'option figure dans l'intitulé à juste titre "La plus complète de la liste de XX options pour la version 6 de Java JVM" de la page. (Il y a beaucoup de XX options proposées qui n'apparaissent pas dans la documentation de Sun. Malheureusement, la page fournit quelques détails sur les options qui s'en réalité.)

Vous devriez probablement commencer à chercher pour voir si votre application / webapp a des fuites de mémoire. Si elle a, vos problèmes ne vont pas disparaître, à moins que ces fuites sont trouvés et corrigés. Dans le long terme, de jongler avec le Hotspot GC options de ne pas corriger les fuites de mémoire.

0voto

dave Points 1

J'ai trouvé à l'aide de -XX:PretenureSizeThreshold=1m de faire les "grands" de l'objet de rendez-vous immédiatement titularisés espace considérablement réduit ma jeune GC et simultanées de défaillances de mode, car il a tendance à ne pas essayer de vider le jeune + 1 survivant de la quantité de données (xmn=1536m survivorratio=3 maxTenuringThreashould=5) avant de la CMS cycle complet. Oui mon survivant de l'espace est grand, mais environ une fois tous les 2 jours, quelque chose arrive dans l'application qui en ont besoin (et nous courons 12 app serveurs chaque jour pour 1 app).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X