34 votes

Existe-t-il un guide de livre de recettes pour les problèmes de GC?

Presque tout le monde finit par s'exécute en GC des problèmes avec Java.

Est-il un livre de guide ou semi-automatique outil pour régler GC pour Java?

Mon raisonnement est ceci:

  • Presque tout le monde a, finalement, ces problèmes
  • Il existe de nombreux facteurs (par exemple 20) dont seuls quelques affecter votre problème.
  • La plupart des gens ne savent pas comment identifier les facteurs clés de sorte GC accord est plus comme un noir art qu'une science.
  • Pas tout le monde utilise un HotSpot de la VM. Différents Soleil versions sont différentes GC caractéristiques.
  • Il y a peu d'incitation à l'expérience (comme l'exécution de la VM légèrement différents paramètres de chaque jour pour voir comment ils jouent).

Donc, la véritable question est: Est-il quelque chose que je peux utiliser dans une liste de vérification de la sorte? Ou peut-être même un outil qui analyse GC journaux ou des tas de détritus et me donne des conseils spécifiques où chercher (au lieu de me dire "95% des données sont affectées à des objets de type byte[]" qui est fondamentalement inutile).

Questions connexes:

21voto

Ales Plsek Points 3581

De diverses ressources, j'ai compilé une liste de vérification de la santé mentale que j'utilise pour analyser le comportement du GC et de la performance de mes applications. Ces lignes directrices sont d'ordre général et s'applique à tous les fournisseurs spécifiques de la JVM, mais contiennent aussi HotspotVM informations spécifiques à des fins d'illustration.

  1. Désactiver GC Explicite. GC explicite est une mauvaise pratique de codage, il n'aide jamais. Utiliser -XX:+DisableExplicitGC.

  2. Activer le GC de journalisation. Léger mais puissant.

    • Calculer Vivre Ensemble de Données, Taux d'Attribution, et des Taux de Promotion. Cela vous dira si vous avez besoin d'un plus gros Tas ou si votre ex. Les jeunes Gen est trop petit, ou si votre Survivant espaces débordent, etc.
    • Calculer le total des GC temps, il doit être <5% du temps total d'exécution.
    • Utiliser -XX:+PrintTenuringDistribution -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log -XX:+HeapDumpOnOutOfMemoryError -Xloggc:gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -showversion
  3. Envisager d'autres moyens de recueillir des informations sur votre GC. La journalisation est bien, mais il y a parfois léger outils de ligne de commande qui va vous donner encore plus de perspicacité. Par exemple. jstat pour Hotspot qui vous montrera l'occupation/la capacité de l'Eden, et Survivant de l'Ancien Général.

  4. Recueillir Classe Histogrammes ce sont lightweigh et va vous montrer le contenu du tas. Vous pouvez prendre des captures d'écran à chaque fois que vous remarquez une étrange activité GC, ou vous pouvez les prendre avant/après GC:

    • Contenu de la OldGen de l'espace: Vous pouvez trouver les objets qui résident dans la OldGen. Vous avez besoin d'imprimer des histogrammes avant et après la Pleine GC. Et depuis un YoungGen collection est exécutée avant que la totalité de GC, ces Histogrammes va vous montrer le contenu de l'Ancienne génération. Utiliser -XX:+PrintClassHistogramBeforeFullGC -XX:+PrintClassHistogramAfterFullGC.
    • Détecter prématurément objets promus: Pour déterminer si toutes les instances sont promus au début, vous avez besoin d'étudier les Histogrammes pour voir les classes sont attendus à résider dans la OldGen et les classes qui doivent être vus dans le YoungGen. Cela ne peut être fait automatiquement, vous avez besoin à raison de l'objet de chaque classe et de son instance pour déterminer si l'objet est temporaire ou non.
  5. Envisager différentes GC Algorithme. Le VMs viennent généralement avec plusieurs GC implémentations d'offrir divers avantages et des inconvénients : le débit, l'empreinte écologique, la pause-moins de/courte pause, en temps réel, etc. Examiner les options et de choisir celle qui vous convient.

  6. Méfiez-vous des finalize(). Vérifiez que la GC se maintient avec des classes à l'aide d' finalize(). L'exécution de cette méthode peut être très coûteux et cela peut avoir un impact GC et de la demande de débit.

  7. Tas Dumps. C'est la première étape qui est lourd et aura un impact sur l'exécution de l'application. Recueillir le Tas de Vidage à poursuivre l'étude de ce tas de contenu ou à confirmer une hypothèse observée à l'étape 4.

Ressources utilisées:

Livres:

Entretiens/Articles:

Listes De Diffusion:

15voto

Merlin Points 7678

Références pour divers GC:

Oracle

Réglage de Collecte des Ordures avec la version 5.0 de Java[tm] de la Machine Virtuelle

et ce aussi

Java SE 6 HotSpot[tm] de la Machine Virtuelle de Collecte des Ordures Tuning

IBM

Réglage précis de Collecte des Ordures [lien mort]

Extensible Détaillé Toolkit

SAP JVM

Gestion De La Mémoire (Garbage Collection)

Détection Des Fuites De Mémoire

La Détection De La Pendaison De Boucle / VMs

L'analyse de Mémoire Situations

Désolé, je ne connais pas beaucoup de choses à propos de SAP, mais ont fourni certaines choses que j'ai trouvé.

Comme pour un livre de recettes, l'adaptation est plus susceptible d'application spécifique à ce niveau, mais c'est un sujet intéressant.

ADDENDUM

Vous avez également mentionné que des outils d'analyse. Certains candidats sont listés ici:

Savoir de Java collecte des ordures journal d'outils d'analyse?

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