L'utilisation Décharges de discussion

Ce script génère l'URL de recherche Google requis pour la recherche sur la documentation de edocs. Ce script affiche la bannière requis pour la documentation de edocs. Ce script affiche les paramètres de recherche Google requis pour la recherche sur la documentation de edocs.







Ce chapitre décrit comment obtenir et utiliser des décharges de fil JVM Oracle JRockit. Pour plus d'information de base sur les discussions et la synchronisation des threads, consultez la rubrique Fils et verrous.

Une décharge de fil est un instantané de l'état de tous les sujets qui font partie du processus. L'état de chaque fil est présenté avec une dite trace de la pile, ce qui montre le contenu de la pile d'un fil. Certains des fils appartiennent à l'application Java vous exécutez, tandis que d'autres sont des fils internes JVM.

Une décharge de fil révèle des informations sur l'activité de fil d'une application qui peut vous aider à diagnostiquer les problèmes et une meilleure application et optimiser les performances JVM; par exemple, le fil des décharges montrent automatiquement l'apparition d'une impasse. Ou apporter un peu de serrures à pêne dormant tout d'une application à un arrêt complet.

Les sujets suivants sont abordés dans ce chapitre:

Création d'Décharges de discussion

Pour créer un vidage de fil d'un processus, effectuez des opérations suivantes:

  • Appuyez sur Ctrl-Pause pendant que le processus est en cours (ou en envoyant SIGQUIT au processus sous Linux).
  • Entrez ce qui suit à la ligne de commande au démarrage:
    bin \ jrcmd.exe print_threads

Le vidage de fil apparaît à la ligne de commande.

Pour plus d'informations sur jrcmd et les gestionnaires Ctrl-Pause, voir Exécution des commandes de diagnostic.

Lecture Décharges de la discussion

Cette section décrit le contenu typique d'une décharge de fil en passant par un exemple vidage de fil du début à la fin. Tout d'abord, un exemple vidage de fil, décomposé en ses composantes est présentée (voir la liste 20-1. Listing 20-2. Listing 20-3. Listing 20-4 et Listing 20-5). Tout d'abord, des informations sur le thread principal est imprimé, puis tous les fils internes JVM, suivi par tous les autres threads d'application Java (s'il y en a). Enfin, des informations sur les chaînes de verrouillage sont imprimées.

L'exemple vidage de fil est tiré d'un programme qui crée trois fils qui sont rapidement contraints dans une impasse. Les fils d'application Fil-0, Fil-1, et correspondent Thread-2 à trois classes différentes dans le code Java.

Le début de la discussion Dump

Le vidage de fil commence avec la date et l'heure de la décharge, et le numéro de version de la machine virtuelle Java JRockit utilisée (voir la liste 20-1).

Liste 20-1 Les informations initiales d'une décharge de fil

Trace de la pile pour l'application principale de cette discussion

Listing 20-2 montre la trace de la pile du fil d'application principale. Il y a une ligne d'information de fil, suivi d'informations sur les verrous et une trace de la pile du fil au moment de la décharge de fil.

Listing 20-2 Le fil conducteur dans la décharge de fil

Une fois le nom et d'autres informations d'identification, les différents messages d'état du thread principal sont imprimés. Le fil conducteur dans le Listing 20-2 est un fil conducteur (en vie), il est soit l'exécution de code interne machine virtuelle Java ou code JNI défini par l'utilisateur (en natif), et il est actuellement en attente d'un objet à être libéré (en attente). Si un thread est en attente d'une notification sur un verrou (en appelant Object.wait ()), cela est indiqué en haut de la trace de la pile en attente de notification.

Serrures et chaînes de verrouillage

Pour chaque thread, l'imprime JVM JRockit les informations suivantes:







  • Si le fil tente de prendre un verrou (pour entrer dans un bloc synchronisé), mais le verrou est déjà détenu par un autre thread, cela est indiqué en haut de la trace de la pile, comme « bloqué en essayant de se verrouiller ».
  • Si le fil est en attente d'une notification sur un verrou (en appelant Object.wait ()), cela est indiqué en haut de la trace de la pile comme « en attente de notification ».
  • Si le fil a pris des verrous, cela est indiqué dans la trace de la pile. Après une ligne dans la trace de pile décrivant un appel de fonction est une liste des verrous prises par le fil dans cette fonction. Ceci est décrit comme ^ - verrouillage de maintien (où ^ - sert de rappel que le verrou est pris dans la fonction écrite au-dessus de la ligne avec la serrure).

La sémantique de l'attente (pour la notification) sur un objet en Java est un peu complexe. Tout d'abord, d'entrer dans un bloc synchronisé, vous devez prendre le verrou de l'objet, et vous appelez wait () sur cet objet. Dans la méthode d'attente, le verrou est libéré avant que le thread va réellement dormir en attente d'une notification. Quand il reçoit une notification, attendez-re prend le verrou avant de revenir. Donc, si un fil a pris un verrou, et est en attente (pour la notification) sur cette serrure, la ligne dans la trace de pile qui décrit quand la serrure a été prise n'apparaît pas comme « verrou de maintien », mais comme « Lock libéré en attendant « .

Présentation des écluses Out of Order

Les lignes avec les informations de verrouillage ne sont pas toujours correcte, en raison d'optimisations du compilateur. Cela signifie deux choses:

  • Si un fil, dans la même fonction, se verrouille une première et l'ordre dans lequel elles sont imprimées puis verrouillez B, est non spécifiée.
  • Si un fil, dans la méthode foo () appelle la méthode bar (). et prend une serrure à barre A (). le verrou peut être imprimé comme étant pris dans foo ().

Normalement, cela ne devrait pas être un problème. L'ordre des lignes de verrouillage ne doit jamais se déplacer beaucoup de leur position correcte. En outre, les lignes de verrouillage ne seront jamais manquantes vous pouvez être assuré que toutes les serrures prises par un fil sont présentés dans la décharge de fil.

JVM filetage interne

Listing 20-3 Le premier et le dernier fil dans une liste de threads internes JVM

Comme vous pouvez le voir, des traces d'information de verrouillage et de la pile ne sont pas imprimés pour les fils internes JVM dans le Listing 20-3. Ce sont les paramètres par défauts.

Si vous voulez voir des traces de pile pour les fils internes JVM, utilisez le paramètre nativestack = true lorsque vous envoyez le gestionnaire des print_threads. Sur la ligne de commande, écrivez ce qui suit:

bin \ jrcmd.exe print_threads nativestack = true

Autres Java Threads application

Liste 20-4 threads d'application supplémentaires

Chaînes de verrouillage

Une caractéristique importante de la machine virtuelle Java JRockit est qu'il détecte automatiquement interblocage, bloqué et les chaînes de verrouillage ouvertes entre les fils en cours d'exécution. L'analyse du Listing 20-5 présente les toutes les chaînes de verrouillage créées par les fils T1, T2, T3, T4 et T5. Ces informations peuvent être utilisées pour régler et dépanner votre code Java.

Listing 20-5 et bloqué Deadlocked chaînes de verrouillage

Statut du Sujet dans cette discussion Décharges

Cette section décrit les différents statuts ou états un thread peut montrer dans une décharge de fil. Il existe trois types d'états:

vie Etats

Le tableau 20-1 décrit les états de vie un fil peut montrer dans une décharge de fil.

spécial Etats

Le tableau 20-3 décrit les états spéciaux un thread peut montrer dans une décharge de fil. Notez que tous ces états ne sont pas mutuellement exclusifs.

Résolution des problèmes avec filetage Décharges

Cette section contient des informations sur comment utiliser fil des décharges pour le dépannage et le diagnostic.

Pour utiliser les décharges de fil pour le dépannage, au-delà de la détection des blocages, vous devez prendre plusieurs fils dépotoirs du même processus. Toutefois, si vous voulez faire longue analyse de temps de comportement que vous serez probablement plus aidé en combinant fil de temps en temps décharges avec d'autres outils de diagnostic, tels que le JRockit Runtime Analyzer, qui fait partie d'Oracle JRockit Mission Control (voir Utilisation Oracle JRockit Mission Control Outils pour plus d'informations).

interblocages détection

La machine virtuelle Java Oracle JRockit analyse automatiquement les informations de vidage de fil et détecte s'il existe des chaînes de verrouillage circulaires (impasse) ou bloqués en elle.

Traitement Detecting goulots

Pour détecter plus dans vos discussions blocages, vous devez faire plusieurs décharges de fil consécutifs. Cela vous permet de détecter l'apparition de conflits, où plusieurs threads tentent d'obtenir le même verrou. Contention pourrait créer de longues chaînes de verrouillage ouvertes qui, sans l'impasse, dégraderont la performance.

Si vous découvrez (dans un ensemble de décharges de fil consécutifs) qu'un ou plusieurs threads dans votre application est temporairement bloqué en attente d'un verrou soit relâché, alors vous pourriez avoir raison de regarder par-dessus le code de votre application Java pour voir si la synchronisation (sérialisation) est nécessaire ou si les fils peuvent être organisés différemment.

Afficher le profil d'exécution d'une application

En faisant plusieurs décharges de fil consécutifs, vous pouvez obtenir rapidement un aperçu des parties de votre application Java qui sont les plus utilisés. Cependant, vous devriez consulter l'onglet Threads Management Console JRockit pour obtenir des informations plus détaillées sur la charge de travail sur les différentes parties de votre application.







Articles Liés