JVM Performance, Speicher & Diagnose

Heap, GC, JFR, Thread Dumps, Connection Pools, Virtual Threads und messbare Performance-Hypothesen.

Version 2Java RuntimeCodeDiagramm
Diagramm JVM Performance, Speicher & Diagnose
Fachlich-technische Darstellung zu JVM Performance, Speicher & Diagnose.

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

EntscheidungGute PraxisPrüffrage
Fachliche GrenzeZuerst Use Case, Invariante und Verantwortlichkeit klären.Welche Geschäftsentscheidung wird geschützt?
Technische GrenzeFramework-/Library-Code hinter Port, Adapter oder Konfiguration kapseln.Kann die Domain ohne Framework getestet werden?
BetriebTimeouts, Logs, Metriken, Traces, Security und Rollback definieren.Wie erkennt der Betrieb Fehler rechtzeitig?

Ausführliche Beispiele

JFR und GC Logs aktivieren
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
Performance-Anti-Pattern vermeiden
// 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

StolperfalleWarum gefährlich
Heap immer erhöhenMehr Heap kann Pausen verlängern und Ursachen verdecken.
Nur Durchschnittslatenz messenp95/p99 sind für Nutzer und SLOs wichtiger.
Thread Dump ohne KontextOhne TraceId, Metriken und Logs bleibt Analyse unvollständig.
⌂ Cockpit