Status: verifiziert — echter Thread-Dump gegen den laufenden
concordiaPortalServergezogen, sowohl über Liberty-Bordmittel (server javadump) als auch überjcmd(HotSpot).
cd concordia-portal/target/liberty/wlp/bin
./server javadump concordiaPortalServer
Reale Ausgabe:
Speicherauszug für Server concordiaPortalServer wird erstellt.
Der Speicherauszug des Servers concordiaPortalServer in
.../concordiaPortalServer/javadump.20260817.221047.26180.0001.txt ist abgeschlossen.
Das erzeugt eine Textdatei mit vollständigem Thread-Dump (813 Zeilen in unserem Testlauf) — der
Weg, der auf jeder Liberty-Installation funktioniert, egal ob darunter HotSpot oder IBM
Semeru läuft. Das ist der Grund, warum ein WAS-Admin diesen Befehl statt eines
JVM-spezifischen Tools als ersten Reflex kennen sollte.
jcmd (HotSpot-spezifisch, hier verwendet)jps -l # PID der Liberty-JVM finden (ws-server.jar)
jcmd <pid> Thread.print # Thread-Dump direkt in die Konsole
jcmd <pid> GC.heap_info # Heap-Zusammenfassung, siehe 01-jvm-heap-und-gc.md
Auf IBM Semeru/OpenJ9 wäre das Äquivalent jcmd <pid> Dump.java bzw. das Setzen eines
Signal-Handlers für kill -3 — jcmd selbst existiert dort auch, aber nicht alle
Subcommands sind identisch, siehe 01-jvm-heap-und-gc.md für die
grundsätzliche Werkzeug-Tabelle.
53 Threads insgesamt, davon 16 im Liberty-Default Executor-Pool aktiv (Namen
Default Executor-thread-N). Beispiel-Eintrag:
"Default Executor-thread-5" #57 [9932] daemon prio=5 os_prio=0 cpu=203.12ms elapsed=98.34s
java.lang.Thread.State: WAITING (on object monitor)
WAITING (on object monitor) bei einem Pool-Thread ist der Normalzustand — der Thread wartet
im Pool auf die nächste Aufgabe, das ist kein Problem. Ein Warnsignal wäre stattdessen viele
Threads gleichzeitig im Zustand RUNNABLE mit demselben Stacktrace (deutet auf einen
Hotspot/Bottleneck hin) oder BLOCKED (deutet auf Lock-Contention/Deadlock-Verdacht hin) — siehe
docs/30-troubleshooting-runbooks/ für konkrete Runbooks zu
diesen Mustern.
Ein vollständiger Heap-Dump (jcmd <pid> GC.heap_dump <datei>.hprof bei HotSpot bzw.
automatisch bei OutOfMemoryError mit -XX:+HeapDumpOnOutOfMemoryError) wurde hier bewusst
nicht gezogen — bei einem gesunden, kaum ausgelasteten Dev-Server liefert er keine
aussagekräftigen Daten, und die Datei kann je nach Heap-Größe sehr groß werden. Der Befehl selbst
ist aber derselbe Grundgedanke wie bei server javadump: ein Snapshot-Kommando, das man vor
einem Neustart/Incident-Response zieht, nicht erst danach.