Comment analyser un vidage de thread java (Java)

Je suis en train de comprendre plus sur Java, en particulier sur la gestion de la mémoire et de fils.
Pour cette raison, je l'ai récemment trouvé un intérêt à regarder les décharges de fil.







Voici quelques lignes prises à partir d'une application Web à l'aide VisualVM, un outil intégré pour Java:

D'abord, j'ai des questions sur certains noms de variables:


  • qu'est-ce que tid et JNV signifie?
  • Quelle est la figure entre parenthèses au carré après Object.wait?

Ensuite, pour la pile tracer lui-même:


  • qu'est-ce que cela signifie en attente sur <. > (Un java.lang.) Et quel est le nombre de <..>
  • qu'est-ce que cela signifie verrouillé <. > (Un java.lang.) Même question, ce qui est en <..>

Je pensais que le mot verrouillé était lié à une condition someway d'attente, cependant, je me suis trompé. En fait, je me demande pourquoi verrouillé est répété trois fois, mais le fil est en état inexécutable comme on le voit dans la même décharge:

Puis enfin, ce fut le pire d'entre eux:

Ce fil est en état inexécutable, mais il attend la condition. Quel état et ce qui est 0x00000?

Pourquoi la trace de la pile est si courte, sans aucune preuve de la classe de fil?

Si vous pouviez répondre à toutes mes questions, je serais très reconnaissant.

Le TID est id thead et JNV est: ID fil natif. Cet ID est très dépendant de la plateforme. Il est JNV dans des décharges de fil jstack. Sous Windows, il est tout simplement le fil de niveau OS ID dans un processus. Sous Linux et Solaris, il est le PID du fil (ce qui est un processus léger). Sous Mac OS X, il est dit être la valeur pthread_t native.

Aller à ce lien: Java niveau ID de fil. pour une définition et une explication plus détaillée de ces deux termes.

Il explique ce que l'attente sur les moyens: Un verrou empêche plus d'une entité d'accéder à une ressource partagée. Chaque objet Java ™ a un verrou associé (obtenu en utilisant un bloc synchronisé ou méthode). Dans le cas de la machine virtuelle Java, les threads en compétition pour diverses ressources dans la machine virtuelle Java et des verrous sur les objets Java.







Ensuite, il décrit l'écran comme un type particulier de mécanisme de verrouillage qui est utilisé dans la machine virtuelle Java pour permettre la synchronisation entre les fils flexibles. Aux fins de la présente section, lisez les termes de surveiller et verrouiller de façon interchangeable.

Ensuite, il va plus loin:

Pour éviter d'avoir un moniteur sur chaque objet, la machine virtuelle Java utilise habituellement un drapeau dans un bloc de classe ou une méthode pour indiquer que l'élément est verrouillé. La plupart du temps, un morceau de code transitera une section sans contention bloquée. Par conséquent, le drapeau de gardien est suffisant pour protéger ce morceau de code. On appelle cela un écran plat. Cependant, si un autre thread veut accéder à un code qui est verrouillé, une véritable affirmation a eu lieu. La machine virtuelle Java doit maintenant créer (ou gonfler) l'objet du moniteur pour maintenir le deuxième fil et prendre des dispositions pour un mécanisme de signalisation pour coordonner l'accès à la section de code. Ce moniteur est maintenant appelé un moniteur gonflé.

Voici une explication plus approfondie de ce que vous voyez sur les lignes de la décharge de fil. Un thread Java est mis en œuvre par un fil natif du système d'exploitation. Chaque fil est représenté par une ligne en gras, tels que:

"Fil-1" (TID: 0x9017A0, sys_thread_t: 0x23EAC8, état: R, ID natif: 0x6E4) prio = 5

* Les 6 éléments suivants explique ce que je les ai de l'exemple correspondait, les valeurs dans les crochets []:

La « attente sur » semble être un thread démon associé à la machine virtuelle elle-même et pas le fil d'application en soi. Lorsque vous obtenez un « dans Object.wait () », cela signifie que le thread démon, « finaliseur » ici, est en attente d'une notification au sujet d'un verrou sur un objet, dans ce cas, il vous montre ce que la notification qu'il attend sur: « - attendre sur <0x27ef0288> (Un java.lang.ref.ReferenceQueue $ Lock) »

Définition du ReferenceQueue est: les files d'attente de référence, à laquelle des objets de référence enregistrés sont ajoutés par le collecteur de déchets après sont détectés les changements appropriés joignabilité.

Le fil de finaliseur fonctionne de sorte que la collecte des ordures fonctionne pour nettoyer les ressources associées à un objet. Si je vois qu'il corectly, le finaliseur ne peut pas obtenir le verrou à cet objet: java.lang.ref.ReferenceQueue.remove (ReferenceQueue.java:118) parce que l'objet java est en cours d'exécution d'une méthode, de sorte que le fil est finaliseur verrouillé jusqu'à cet objet est terminé avec sa tâche en cours.

En outre, le finaliseur ne cherche pas seulement à récupérer la mémoire, il est plus impliqué que pour le nettoyage des ressources. Je dois faire une étude plus approfondie sur elle, mais si vous avez des fichiers ouverts, prises, etc. liés à un méthodes d'objets, le finaliseur va travailler sur la libération de ces articles ainsi.

Quelle est la figure entre parenthèses au carré après Object.wait dans la décharge de fil?

Il est un pointeur en mémoire sur le fil. Voici une description plus détaillée:

Informations C.4.1 Thread

La première partie de la section de filetage montre le fil qui a provoqué l'erreur fatale, comme suit:

Le pointeur de fil est le pointeur sur la structure taraudée machine virtuelle Java. Il est généralement pas d'intérêt à moins que vous déboguez un fichier Java VM en direct ou le noyau.

Voici quelques liens sur les haldes fil:







Articles Liés