Wie kann ich einen hängenden Java-Thread debuggen?

8

Ich habe folgendes Problem:
Ich stelle eine Webanwendung in Tomcat (Linux) und nach dem Herunterfahren von Tomcat bereit, wenn ich ps -ef mache, kann ich immer noch den java -Prozess laufen sehen.
Ich glaube, das passiert aufgrund eines hängenden Threads, aber ich weiß nicht, wie ich diesen Thread nachverfolgen kann.
Wie kann ich dieses Problem beheben?

    
Jim 10.07.2012, 05:55
quelle

2 Antworten

5

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

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

Wenn Sie diese nun durch Samurai laufen lassen, werden diese in roter Farbe hervorgehoben, so dass Sie schnell darauf zugreifen können Klicken Sie darauf und gelangen Sie zu den Zeilen mit den Problemen.

Sehen Sie ein Beispiel für diese hier . 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, drücken Sie einfach Ctrl-\ . Wenn die JVM im Hintergrund läuft, senden Sie ihr das Signal QUIT:

kill -QUIT process_id

Dort ist Prozess-ID die Prozessnummer des laufenden Java-Prozesses. Der Thread-Dump wird dorthin gesendet, wo auch Standard-Out umgeleitet wird. In der Regel erhalten Sie die Prozessnummern aller laufenden Java-Prozesse mit folgendem Befehl:

ps axf | grep java

    
aviad 10.07.2012, 06:01
quelle
2

Sie sagen, dass Ihr Java-Prozess noch existiert, oder? Prozesse existieren, solange sie Threads angehängt haben, richtig? Wenn ja, würde ich für den folgenden Ansatz gehen:  - Führen Sie den Prozess mit dem MBean-Server aus, der an die JVM angehängt und intern verwaltet wird.

Verbinden Sie sich dann mit dem Prozess, nachdem Sie das QUIT-Signal gesendet haben und holen Sie sich den Thread-Dump (es sollte ein JMX dafür sein. Sehen Sie, welche Threads Ihnen verdächtig vorkommen.

Ich denke, Sie können JVisualVM auch verwenden, um Thread-Dumps zu machen ...

    
Mark Bramnik 10.07.2012 06:10
quelle