Obtention de l'identificateur de thread Java et de la trace de la pile du thread Java runtime
Sur mon plus achalandé de l'installation de production, à l'occasion, j'obtiens un seul thread qui semble coincé dans une boucle infinie. Je n'ai pas réussi à trouver qui est le coupable, après beaucoup de recherche et de débogage, mais il semble que ce devrait être possible. Voici les détails techniques:
Actuel de débogage notes:
1) ps -eL 18975 me montre le Linux pid le problème de l'enfant thread, 19269
$ps -eL | grep 18975
...
PID LWP TTY TIME CMD
18975 18994 ? 00:00:05 java
18975 19268 ? 00:00:00 java
18975 19269 ? 05:16:49 java
18975 19271 ? 00:01:22 java
18975 19273 ? 00:00:00 java
...
2) jstack -l 18975 dit il y a pas de blocages, jstack -m 18975 ne fonctionne pas
3) jstack -l 18975 me donne la trace de la pile pour tous mes fils (~400). Exemple de la pile des threads (et pas le problème):
"http-342.877.573.944-8080-360" démon prio=10 tid=0x0000002adaba9c00 nid=0x754c dans l'Objet.wait() [0x00000000595bc000..0x00000000595bccb0] java.lang.Fil de discussion.État: en ATTENTE (sur l'objet du moniteur) à java.lang.Objet.attendre(Native method) - en attente sur (un org.apache.tomcat.util.net.JIoEndpoint$Travailleur) à java.lang.Objet.attendre(de l'Objet.java:485) au org.apache.tomcat.util.net.JIoEndpoint$Par Travailleur.attendent(JIoEndpoint.java:416) - verrouillé (un org.apache.tomcat.util.net.JIoEndpoint$Travailleur) au org.apache.tomcat.util.net.JIoEndpoint$Par Travailleur.exécuter(JIoEndpoint.java:442) à java.lang.Fil de discussion.exécution(Thread.java:619)
4), Le ps -eL sortie de l'ID de thread ne pas correspondre à la sortie de jstack, ou, au moins, je ne le vois pas. (jstack la documentation est un peu clairsemée.)
5) Il n'y a pas de lourds IO, l'utilisation de la mémoire ou autre activité correspondante d'indices de travailler avec.
Plate-forme:
- Java 6
- Tomcat 6
- RHEL 4 (64-bit)
Quelqu'un sait comment je peux faire la connexion de la linux sortie ps pour mon enfant problème de java thread? Si proche, et pourtant si loin...
source d'informationauteur Stu Thompson
Vous devez vous connecter pour publier un commentaire.
Il ressemble à la nid dans le jstack de sortie est le Linux LWP id.
Convertir le nid à la décimale et vous avez la LWP id. Dans votre cas 0x754c est 30028. Ce processus n'est pas montré dans notre ps de sortie, mais il était probablement l'un des LWPs vous avez omis pour économiser de l'espace.
Voici un peu de Perl extrait de code que vous pouvez utiliser pour rediriger la sortie de jstack:
Vous pouvez utiliser JConsole pour afficher le fil de la trace de la pile.
Si votre utilisation de JDK 1.6.0_07 ou ci-dessus, vous pouvez également utiliser visualvm.
Les deux outils offrent une belle vue de tous les threads en cours d'exécution dans une application. Le visualvm est un peu plus agréable, mais nous espérons voir tous les threads peuvent vous aider à suivre le fil.
Vérifier pour les threads qui sont toujours en état de MARCHE. Lorsque nous avons eu une fugue fil, la trace de la pile n'auront de cesse de changer. Nous avons donc été en mesure de dire qui des méthodes de la boucle a l'appel, et la piste vers le bas de la boucle.
Nice,les réponses utiles!
Pour Linux, ps -efL, -L'option afficher le LWPs.
Comme une note côté, l'
"http-342.877.573.944-8080-360" démon prio=10 moyens
"ThreadName(donnée par la JVM)" runningmode(héritée de la pid) priorité(héritée de la pid)
À partir de la mémoire si vous appuyez sur CTRL-BREAK sur la console vous permettra de faire un dump de threads en cours et quelques-uns de leurs trace de la pile d'images.
À partir de la mémoire (je ne suis pas sûr si c'est un IntelliJ IDEa fonction, ou s'il est par défaut en java) mais il vous dira que le fil est dans l'impasse, et l'objet sur lequel ils sont en attente. Vous devriez être en mesure de rediriger la sortie vers un fichier, et juste grep pour l'IMPASSE du texte.
JConsole, VisualVM ou d'autres profileurs comme JProfiler sera également vous montrer les fils et leurs piles, cependant si vous ne souhaitez pas utiliser d'outil externe je pense que CTRL-BREAK va vous donner ce que vous cherchez.
Sur le SOLEIL
Noter que
prstat
par défaut indique le pas de lumière poids de processus , et non la LWPID.Pour voir les informations de tous les processus légers pour un utilisateur en particulier l'utilisation de la
-L
option.maintenant utiliser le LWPID et de le convertir en hexadécimal et le faire correspondre avec le nid de la thread dump