Lors de l'utilisation du logiciel Java, des problèmes étranges surviennent parfois inexplicablement. Ces problèmes ne peuvent souvent pas être localisés à l'aide d'informations sur le journal. Pour le moment, nous devons analyser le problème en vérifiant la relation d'appel de pile des fils à l'intérieur du processus.
Par exemple, lorsque nous effectuons une opération, plusieurs boîtes d'avertissement apparaîtront inexplicablement, dont certaines sont normales et certaines ne le sont pas. Pour ces messages d'avertissement d'erreur, comment devons-nous localiser le code auquel l'emplacement a une boîte contextuelle d'erreur? Nous devons afficher les différents threads du logiciel après la boîte contextuelle et savoir quel thread provoque le problème. Mais parfois, en raison de l'environnement, du temps et d'autres problèmes, nous ne pouvons pas utiliser l'IDE pour déboguer. Nous ne pouvons prendre un instantané de mémoire que via le logiciel d'outil, puis analyser les informations de mémoire.
Aujourd'hui, je présente un outil couramment utilisé: JSTACK
JSTACK est un outil qui est livré avec JDK et est également un logiciel avec un taux d'apparence très élevé dans le réglage des performances JVM. Il est donc très nécessaire de le maîtriser.
JSTACK peut générer des instantanés de fil du point actuel dans le temps du JVM.
Un instantané du fil est une collection de piles de méthodes que chaque thread de la JVM actuelle exécute. Les principales raisons de générer des instantanés de fil:
1. La raison des pauses à long terme de threads à travers des instantanés de fil, tels que des impasses entre les threads, les boucles mortes et l'attente à long terme causée par la demande de ressources externes.
2. Déterminez la source des informations d'exception via l'analyse instantanée du fil de la relation d'appel de la méthode d'exécution actuelle.
Il est très simple à utiliser:
(PS: La prémisse est que vous avez déjà un JDK avec JSTACK. Il est préférable d'avoir l'ensemble de variables d'environnement.)
Étape 1: Voir le PID du processus via Windows Task Manager
Ici, nous parlons brièvement de ce qui est PID: le PID est l'identité de chaque processus. Il s'agit d'une identité unique attribuée par le système d'exploitation pour identifier l'identité du processus après le démarrage du logiciel.
Comme indiqué
Sous l'onglet Process, Affichage> Sélectionner la colonne
Vérifiez PID et confirmez
Passez à l'onglet Application et sélectionnez le programme dans la mémoire d'instantané. L'image sélectionnée est Android Studio. Cliquez avec le bouton droit pour aller au processus.
Ici, nous pouvons voir que le PID correspondant d'Android Studio est 9952
La deuxième étape consiste à ouvrir la ligne de commande et à exécuter le programme JSTACK
Notez que si la variable d'environnement n'est pas ajoutée avec succès, elle ne peut être exécutée que dans le chemin JSTack, sinon le système d'exploitation ne le reconnaîtra pas.
Comme le montre la figure, il existe généralement deux paramètres de fonctionnement ici, qui sont utilisés pour prendre des instantanés de mémoire.
Leurs significations sont les suivantes:
-L Longues annonces imprimeront des informations de verrouillage supplémentaires. Lorsqu'une impasse se produit, vous pouvez utiliser JSTACK -L PID pour observer la situation de tenue de verrouillage
-m mode mixte, non seulement produit des informations sur la pile Java, mais fournit également des informations de pile C / C ++ (telles que la méthode native)
Nous utilisons généralement le paramètre -L pour répondre aux besoins
Le format est le suivant JStack -l pid >> 123.txt
PS Remarque ici >> signifie redirection, ce qui signifie la sortie des instantanés capturés vers 987.txt. >> il est préférable de conserver les espaces lorsque les deux fois
De cette façon, nous générerons un fichier 987.txt dans le chemin de la ligne de commande et écrire l'instantané de mémoire dans ce texte en même temps.
Comme indiqué dans la figure ci-dessous: