Wie man den stack-trace der thread
Ich habe eine Multithread-Anwendung. Mehrere Nachrichten, die kommen, um die Anwendung und Verarbeitung in getrennten threads. Dafür bin ich mit Klassen ThreadPoolExecutor und FutureTask aus dem Paket java.util.concurrent.
Gelegentlich habe ich einige deadlocks in der Anwendung. Wenn ein deadlock Auftritt, möchte ich unterbrechen, die blockierende Threads, und ich will melden dem stack-trace von diesem thread, so dass ich später den deadlock aufzulösen.
Gibt es eine Möglichkeit, wie finden wir den stack-trace von einem thread außerhalb des Threads in Java?
- Sie meinen, Sie wollen erkennen, deadlock und sich erholen? Nie getan, aber mit einem stack-trace, für das klingt nicht der richtige Weg für mich..
- Ich muss den stack-trace, so, dass ich weiß, wo der thread geblieben und können das problem beheben, so dass die Anwendung funktioniert alles nach dem Neustart. Aber ich möchte zu unterbrechen, die blockierende Threads, so dass die Anwendung funktioniert, bis ich einige Zeit, um das problem zu beheben und lassen Sie es.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sehen hier wie stack-Ablaufverfolgungen zu erzeugen, einschließlich, wie dies programmatisch. Von der Konsole aus, Strg+Pause wird dump der Stacktraces zu stdout. Siehe auch diese Frage ALSO für mehr details.
kill -QUIT <pid>
) signal an den java-Prozess wird auch die Ausgabe der stack-trace, um die standard-Ausgabe.Könnten Sie melden der Stacktraces aller Threads von Zeit zu Zeit (oder vor Tötung der Prozess) innerhalb Ihrer Anwendung. Das zu tun, verwenden Sie:
Beim ausführen nächtlichen automatisierten tests, ein Teil einer der Testfälle wird in einem deadlock. Ich habe eine "TimeBomb" daemon thread wartet 30 Minuten, und wenn dann protokolliert alle stack-traces wie oben.
Bevor Sie in die Sackgasse der region, setzen Sie ein Feld wie,
In Ihrem monitoring-thread, die Sie ausführen können, thread.getStackTrace(); um den stack-trace des Threads jederzeit.
Verwenden Sie JStack. Hier ist eine schöne blog-Eintrag, die details, wie man die stack-traces.
Ich war nicht sicher, wenn Sie wollen, um den stacktrace aus, die innerhalb der gleichen JVM oder extern, aber wenn Sie wollen, um den stack-trace mit externen Werkzeugen die folgenden helfen:
Du könnte implementieren Sie eine regelmäßige Aufgabe, zu prüfen, für deadlocks (wo deadlocks sind java-intrinsische oder
Lock
basiert) und rufeninterrupt
auf alle threads beteiligt, die in das Szenario. Dies hat jedoch keine Garantien, dass es Ihr problem zu lösen. Seine wahrscheinlich das Szenario, das wird nur wieder passieren. Sehen Dr. Heinz s Artikel über einen deadlock-Detektor für details.Wenn der Tat, es gibt keine Garantie, dass
interrupt
wird sogar kostenlos bis einen blockierten Prozess wie diesem. Seine ein weit besserer Ansatz zur Vermeidung von deadlock-Szenario in den ersten Platz, zum Beispiel durch die Verwendung von sperren mit timeouts und Wiederholungsversuche Strategien oder 'versuchen, bevor Sie kaufen' - Ansätze.Wenn Sie wollen, um dieses Programm wieder Folgen Dr. Heinz Beispiel. Falls nicht, generieren Sie einfach die thread-dump, wenn Sie herausgefunden haben das problem.
Ja und Nein. Sie können dump die threads von anderen VMs aber Ihre stack-traces möglicherweise nicht so nützlich, wie Sie vielleicht denken, um die Bestimmung der Ursachen von deadlock. Wenn ein echter deadlock erkannt wurde (durch die JVM selbst auf thread-dump Ihre Anwendungen VM), sollten Sie alles, was Sie brauchen, um das Debuggen der Ursache (mehr oder weniger).