Deadlocks analysieren

Jeder Entwickler kennt sie und hat auch schon - meist schmerzliche - Bekanntschaft mit ihnen gemacht: Deadlocks. Die Anwendung reagiert nicht mehr oder nicht mehr wie erwartet. Wie findet man nun heraus, worin das Problem im Detail liegt?

Innerhalb einer IDE, wie beispielsweise Eclipse, ist eine Analyse verhältnismäßig einfach. Problematisch wird es jedoch, wenn die Probleme außerhalb der IDE auftauchen und ein Remote-Debugging nicht möglich ist.

Die JavaVM bietet für diese Fälle einen einfachen Weg den aktuellen Zustand aller Threads in einem Stack-Trace ähnlichen Format auszugeben: dem so genannten Thread Dump. Dieser kann über zwei Wege erstellt werden:

  • STRG + PAUSE: Wird diese Tastenkombination in einem Java Konsolen-Fenster betätigt, erstellt die JavaVM einen Thread Dump und gibt diesen auf der Konsole aus. Der Vorteil dieser Variante ist, dass keine zusätzlichen Werkzeuge benötigt werden. Ein Thread Dump ist somit sehr einfach zu erstellen.
  • Mittels der Tools jps und jstack (zu finden im Verzeichnis jdk-home/bin): Leider steht das Tool jstack unter Windows erst mit JDK 1.6 zur Verfügung. Unter Linux ist es bereits im JDK 1.5 enthalten. Bei der Ausführung von jps werden die PIDs (Process-IDs) aller laufenden Java-Anwendungen ausgegeben. Startet man nun jstack mit der PID des zu untersuchenden Prozesses, gibt das Kommando den Thread Dump auf der Standard-Ausgabe aus. Der Vorteil bei der Nutzung von jstack ist, dass hier nun der Thread Dump ausgegeben wird. Somit können sich keine konkurrierenden Ausgaben auf System.out "dazwischen mogeln".

Prinzipiell handelt es sich bei Thread Dumps um ein ASCII basiertes Format. Für eine komfortable Betrachtung sei aber auf das Werkzeug TDA verwiesen, welches die Daten in einem strukturierten UI zur Verfügung stellt.