Java & JVM
Moderne Java-21-Praxis, Java-25-Migrationsspur und JVM-Diagnose für produktive Systeme. Nutze die Seite während Entwurf und Umsetzung: Arbeite an einem konkreten Codepfad und sichere Fachverhalten, Abhängigkeiten und Wartbarkeit mit passenden Tests.
Arbeitsauftrag
Wann verwenden?
Bei Sprach-, Nebenläufigkeits-, Speicher- oder JVM-Diagnosefragen in produktivem Java-Code.
Nicht dafür verwenden
Nicht für Frameworkkonfiguration ohne Bezug zu Java- oder Laufzeitverhalten.
Definition of Done
Code ist idiomatisch und getestet; Laufzeitannahmen sind gemessen; Fehler- und Ressourcenverhalten sind geklärt.
Wertorientierte Modellierung
Records eignen sich für unveränderliche Datenträger und Value Objects, wenn ihre Invarianten beim Erzeugen geschützt werden. Ein Record ersetzt jedoch nicht automatisch ein gutes Domänenmodell.
Sealed Types begrenzen bekannte Varianten und machen fachliche Fallunterscheidungen explizit. Pattern Matching kann danach die Fallbehandlung lesbarer machen.
public record CustomerId(UUID value) {
public CustomerId {
Objects.requireNonNull(value, "value");
}
}
public sealed interface PaymentResult
permits PaymentAccepted, PaymentRejected {
}
public record PaymentAccepted(String transactionId)
implements PaymentResult {
}
public record PaymentRejected(String reason)
implements PaymentResult {
}
Nebenläufigkeit
Virtual Threads reduzieren die Kosten blockierender I/O-Workloads, lösen aber keine Probleme mit gemeinsamem mutablem Zustand, Datenbankgrenzen oder externen Kapazitätslimits.
Die Senior-Frage lautet nicht nur „Wie viele Threads?“, sondern „Welche Ressource begrenzt den Durchsatz und wie wird Rückstau kontrolliert?“
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
var futures = requests.stream()
.map(request -> executor.submit(() -> client.load(request)))
.toList();
return futures.stream()
.map(Future::resultNow)
.toList();
}
JVM-Diagnose
Für Produktionsprobleme werden Symptome zuerst klassifiziert: CPU, Heap, Native Memory, Threads, GC, I/O oder externe Abhängigkeit. Danach wird das passende Werkzeug gewählt.
Java Flight Recorder liefert zeitbezogene Ereignisse mit geringerem Diagnoseaufwand als eine unstrukturierte Sammlung einzelner Dumps.
# 60 Sekunden Flight Recording starten
jcmd <PID> JFR.start name=incident settings=profile duration=60s filename=incident.jfr
# Thread-Dump erzeugen
jcmd <PID> Thread.print > thread-dump.txt
# Heap-Übersicht
jcmd <PID> GC.heap_info
Praxisartefakt · JVM-Diagnose
- Symptom
- p99-Latenz steigt alle fünf Minuten für etwa acht Sekunden.
- Evidenz
- JFR zeigt Full GC gleichzeitig mit großem temporärem JSON-Buffer.
- Ursache
- Unbegrenzte Response-Aggregation im Exportpfad.
- Korrektur
- Streaming-Ausgabe mit begrenztem Buffer.
- Nachweis
- Gleiche Last ohne Full GC, stabiler Heap und p99 unter Budget.