JVM Performance, Speicher & Diagnose
Heap, GC, JFR, Thread Dumps, Connection Pools, Virtual Threads und messbare Performance-Hypothesen.
Performance beginnt vor dem Tuning
Viele Performanceprobleme entstehen durch fachliche oder architektonische Entscheidungen: zu große Aggregate, N+1 Queries, zu lange Transaktionen, fehlende Pagination, ungünstige Batchgrößen oder Remote Calls in kritischen Pfaden. JVM-Flags sind selten die erste Lösung.
Diagnosewerkzeuge
GC-Logs zeigen Speicher- und Pausenverhalten. JFR zeigt Locks, Methoden, Allocation, I/O und Threads. Thread Dumps helfen bei Deadlocks und blockierenden Aufrufen. Metriken zeigen Trends, Traces zeigen verteilte Latenz.
Virtual Threads im Betrieb
Virtual Threads können blockierende I/O-Szenarien vereinfachen, aber Datenbank- und HTTP-Pools bleiben Ressourcen. Wenn 10.000 virtuelle Threads auf 30 DB-Verbindungen warten, ist die Datenbank weiterhin die Grenze.
Entscheidungen
| Entscheidung | Gute Praxis | Prüffrage |
|---|---|---|
| Fachliche Grenze | Zuerst Use Case, Invariante und Verantwortlichkeit klären. | Welche Geschäftsentscheidung wird geschützt? |
| Technische Grenze | Framework-/Library-Code hinter Port, Adapter oder Konfiguration kapseln. | Kann die Domain ohne Framework getestet werden? |
| Betrieb | Timeouts, Logs, Metriken, Traces, Security und Rollback definieren. | Wie erkennt der Betrieb Fehler rechtzeitig? |
Ausführliche Beispiele
java \
-XX:StartFlightRecording=filename=/var/log/order/startup.jfr,dumponexit=true \
-Xlog:gc*:file=/var/log/order/gc.log:time,uptime,level,tags \
-XX:MaxRAMPercentage=75 \
-jar order-service.jar
// Anti-Pattern: alle Datensätze laden und im Speicher filtern.
List<Order> all = orderRepository.findAll();
return all.stream().filter(Order::isOpen).toList();
// Besser: fachliche Query mit Limit und Sortierung.
return orderRepository.findOpenOrders(PageRequest.of(0, 100));
Typische Stolperfallen
| Stolperfalle | Warum gefährlich |
|---|---|
| Heap immer erhöhen | Mehr Heap kann Pausen verlängern und Ursachen verdecken. |
| Nur Durchschnittslatenz messen | p95/p99 sind für Nutzer und SLOs wichtiger. |
| Thread Dump ohne Kontext | Ohne TraceId, Metriken und Logs bleibt Analyse unvollständig. |