2012-07-10 13 views
8

Ich habe das folgende Problem:
Ich stelle eine Web-Anwendung in Tomcat (Linux) und nach dem Herunterfahren von Tomcat, wenn ich tun ps -ef Ich kann immer noch sehen, die java Prozess läuft.
Ich glaube, das passiert aufgrund einiger hängender Threads, aber ich weiß nicht, wie ich diesen Thread nachverfolgen kann.
Wie kann ich dieses Problem beheben?Wie kann ich einen hängenden Java-Thread debuggen?

Antwort

5

Sie können 4-5 Thread-Dumps wie unten beschrieben generieren und diese dann mit Tools wie Samurai analysieren.

Was Sie überprüfen möchten, ist, wenn ein festgefahrener Thread oder lang andauernde Transaktion auftritt, zeigen alle Thread-Dumps eine bestimmte Thread-ID in der gleichen Zeile in Ihrem Java-Stack-Trace. Vereinfacht ausgedrückt erstreckt sich die Transaktion über mehrere Thread-Dumps und erfordert daher weitere Untersuchungen.

Jetzt, wenn Sie diese durch Samurai ausführen, wird es diese in roter Farbe hervorheben, so dass Sie schnell darauf klicken und zu den Zeilen mit Problemen gelangen können.

Siehe ein Beispiel dieser here. Sieh dir das Samurai-Ausgabebild in diesem Link an. Die grünen Zellen sind in Ordnung. Rote und graue Zellen müssen betrachtet werden.

Erstellen eines Thread-Dump:

(Linux)

Wenn die JVM in einer Konsole läuft dann einfach Ctrl-\ drücken. Wenn die JVM im Hintergrund läuft dann senden sie die QUIT-Signal:

kill -QUIT process_id

Es process_id ist die Prozessnummer des laufenden Java-Prozess. Der Thread-Dump wird dorthin gesendet, wo auch Standard-Out umgeleitet wird. Regel können Sie die Prozesszahl aller laufenden Java-Prozesse mit dem Befehl erhalten:

ps axf | grep java

+0

sein nicht, dass Jim ist zu fragen, wird er fragt nach approch Debuggen –

+0

@ user1348753, siehe bearbeiten – aviad

+0

@aviad: Ich habe eine 'kill -3' und geladen den Javacore zu Samurai.Es gab keine visuelle Tabelle nur ein Protokoll repor Wie kann ich den Thread aus diesem Bericht verfolgen? – Jim

2

Sie sagen, Ihr Java-Prozess existiert immer noch, nicht wahr? Prozesse existieren, solange sie Gewinde angebracht haben, richtig? Wenn ja, würde ich für den folgenden Ansatz gehen: - den Prozess mit dem MBeanServer laufen befestigt und intern von der JVM

dann eine Verbindung zu dem Prozess verwaltet, nachdem Sie das Signal ENDE senden und die Thread-Dump erhalten (es Siehe sollte, dass eine JMX sein. welche Threads verdächtig zu Ihnen.

ich glaube, Sie auch jvisualvm verwenden können, nehmen Thread-Dumps ...

+0

Ich weiß nicht, wie man die Ansätze macht, die du empfiehlst – Jim

+0

Das sieht noch einfacher aus, aber es war bereits vorgeschlagen von aviad :): http://www.crazysquirrel.com/computing/java/basics/java-thread-dump.jspx –

+0

Wie für den JVisualVM Ansatz - hier ist ein Tutorial http://docs.oracle.com /javase/6/docs/technotes/guides/visualvm/threads.html. Grundsätzlich ist jvisualvm nur eine ausführbare Datei, die im Ordner $ JAVA_HOME/bin gefunden werden kann. Führen Sie es aus, stellen Sie eine Verbindung zu Ihrer Anwendung her und sehen Sie, was Sie damit machen können. Ziemlich mächtige Sachen, wirklich :) –

Verwandte Themen