Status: Werkzeuge/Befehle sind verifiziert (siehe
docs/20-monitoring-tuning/für die realenjcmd-/server javadump-Läufe gegenconcordiaPortalServer). Die konkreten Incident-Szenarien unten sind bewusst als Runbook-Anleitung formuliert, nicht als tatsächlich provozierter Ausfall — ein OOM/Deadlock absichtlich zu erzeugen bringt für ein Lernprojekt wenig zusätzlichen Erkenntnisgewinn gegenüber der korrekten Beschreibung des Diagnose-Wegs.
Erster Reflex: nicht raten, sondern einen Thread-Dump ziehen, bevor der Server ggf. neu gestartet wird (ein Neustart vernichtet den Beweis):
cd concordia-portal/target/liberty/wlp/bin
./server javadump concordiaPortalServer
Auswertung:
RUNNABLE, und teilen sich mehrere davon denselben
Stacktrace? → deutet auf einen konkreten Code-Hotspot hin (z. B. eine teure Query, ein
ineffizienter Loop) — der gemeinsame Stacktrace zeigt direkt, WO.BLOCKED, und warten sie auf dasselbe Lock-Objekt? → Verdacht auf
Lock-Contention, siehe Runbook 3.Default Executor-thread-N-Threads existieren insgesamt, im Vergleich zum
konfigurierten maxThreads in server.xml (siehe
docs/20-monitoring-tuning/03-thread-und-connection-pool-tuning.md)?
Nahe am Maximum + viele wartende Requests → der Pool selbst ist der Engpass, nicht eine
einzelne Methode.Nächster Schritt je nach Befund: Code-Hotspot → an Java-Entwicklung zurückspielen (mit dem
Stacktrace als Beleg); Pool-Engpass → Tuning-Diskussion wie in
docs/20-monitoring-tuning/03-thread-und-connection-pool-tuning.md
beschrieben (Thread-Pool selbst vs. dahinterliegender DB2-Connection-Pool unterscheiden!).
OutOfMemoryErrorVorbeugend, nicht erst danach: -XX:+HeapDumpOnOutOfMemoryError gehört in jede produktive
jvm.options (siehe docs/20-monitoring-tuning/01-jvm-heap-und-gc.md)
— ohne dieses Flag verliert man beim OOM den wichtigsten Diagnose-Datenpunkt.
Nach dem Vorfall:
jcmd <pid> GC.class_histogram bzw. bei bereits abgestürztem Prozess
direkt im Heap-Dump-Analyzer (Eclipse MAT o. ä.) nach "häufigste Instanz" sortieren.docs/40-bindeglied-dev-ops-db2-netzwerk/) —
ein Connection-Leak (Verbindungen werden angefordert, aber nie zurückgegeben, sodass der Pool
sich langsam mit toten/hängenden Objekten füllt).docs/20-monitoring-tuning/01-jvm-heap-und-gc.md):
derselbe Vorfall erzeugt statt einer .hprof-Datei ein javacore.txt + .phd-Heapdump-Paar
— anderes Dateiformat, gleiches Diagnose-Prinzip.jcmd <pid> Thread.print
Im echten Thread-Dump-Format (siehe
docs/20-monitoring-tuning/02-heap-und-thread-dumps.md
für das konkrete Format) nach zwei Mustern suchen:
jcmd/server javadump weisen ihn explizit in einem eigenen
"Found one Java-level deadlock"-Abschnitt aus, falls vorhanden — der einfachste Fall, weil
das Tool die Analyse bereits übernimmt.BLOCKED, die alle auf
dasselbe - waiting to lock <0x...>-Objekt warten, während ein Thread es hält (Zustand
RUNNABLE oder WAITING, aber NICHT BLOCKED) — dieser eine haltende Thread ist der
Untersuchungspunkt: was macht er gerade, warum dauert es so lange?SQLCODE -30081 & Co.)Ausführlich in docs/40-bindeglied-dev-ops-db2-netzwerk/01-db2-fuer-zos-und-mainframe-grundlagen.md
behandelt — hier nur der Verweis, damit alle Runbooks an einer Stelle auffindbar sind: dieser
Fehlerbereich ist der einzige, bei dem die erste Anlaufstelle nicht der WAS-Admin allein ist,
sondern eine Koordination mit dem DB2-for-z/OS- bzw. Netzwerk-Team erfordert (siehe
docs/40-bindeglied-dev-ops-db2-netzwerk/03-netzwerksegmentierung.md).