4 Minuten
Java 26 für Spring Boot Entwickler: Was sich ändert
Einführung
Java 26 ist Mitte März 2026 erschienen. Als Short-Term-Release mit sechs Monaten Support steht es im Schatten von Java 25 LTS. Für Spring Boot Entwickler gibt es trotzdem ein paar relevante Änderungen — einige davon funktionieren automatisch beim JDK-Upgrade, andere erfordern Aufmerksamkeit. Hier die praktisch wichtigsten Punkte.
G1 GC: 5-15% mehr Throughput gratis
JEP 522 überarbeitet die Referenzverfolgung im G1 Garbage Collector. Statt einer gemeinsamen Card Table gibt es jetzt eine duale Card Table — Application- und GC-Threads synchronisieren weniger miteinander.
Das Ergebnis: bei referenzlastigen Workloads (und das sind die meisten Spring Boot Anwendungen) gibt es 5-15% mehr Throughput. G1 ist der Default-GC, also reicht ein JDK-Upgrade.
Wer noch auf Java 21 sitzt, lohnt sich der Blick auf die akkumulierten Verbesserungen: Compact Object Headers in Java 25 reduzieren den Heap-Verbrauch um etwa 22% durch kleinere Objekt-Header (16 statt 12 Bytes).
HTTP/3 im JDK HttpClient
JEP 517 bringt HTTP/3 Support in den Standard-HttpClient. Für Spring Boot gilt: wer RestClient mit dem JDK HttpClient nutzt, kann HTTP/3 einschalten:
HttpClient client = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_3)
.build();
HTTP/3 nutzt QUIC statt TCP. Das eliminates Head-of-Line-Blocking — ein langsamer Request blockiert nicht mehr alle anderen auf der gleichen Verbindung. Für Aufrufe von externen APIs, KI-Inference-Endpoints oder Payment-Gateways relevant.
Falls der Server kein HTTP/3 unterstützt, fällt der Client automatisch auf HTTP/2 zurück. Wer WebClient mit Reactor Netty (WebFlux) nutzt, ist davon vorerst nicht betroffen — Netty hat ein eigenes HTTP/3-Konzept.
final wird ernst genommen (JEP 500)
Das ist die Änderung, die in deinen Logs auftauchen kann, auch wenn du nicht direkt migrierst — weil Libraries betroffen sind.
Jahrelang konnte man per Reflection final-Felder mutieren:
Field field = SomeClass.class.getDeclaredField("FINAL_VALUE");
field.setAccessible(true);
field.set(instance, newValue); // funktioniert in Java ≤ 25
Unter Java 26 wird das mit einer Warnung quittiert:
WARNING: Final field SomeClass.FINAL_VALUE has been mutated reflectively
Noch ist es nur eine Warnung, kein Fehler. Aber in einer zukünftigen JDK-Version wird final wirklich final sein.
Häufig betroffene Libraries: Hibernate (bestimmte Konfigurationen), Mockito Spy-Mechanismus, Lombok, verschiedene Serialisierungs-Frameworks. Spring Framework 7.0 hat seine Reflection-Nutzung bereits bereinigt.
Zwei nützliche JVM-Flags:
# Warnungen als Fehler behandeln (gut für CI)
--illegal-final-field-mutation=deny
# Warnungen unterdrücken (Übergangslösung)
--enable-final-field-mutation=ALL-UNNAMED
Empfehlung: Java 26 in die CI-Pipeline aufnehmen und auf “has been mutated reflectively” prüfen.
UUIDv7 in der Standardbibliothek
Kein JEP, aber praktisch: UUID.randomUUID() generiert Version-4-UUIDs (komplett zufällig). Als Primary Key in Datenbanken verursachen sie Index-Fragmentierung, weil Inserts an zufälligen Positionen stattfinden.
Java 26 fügt UUID.ofEpochMillis(long) hinzu — generiert zeitgeordnete UUIDs. Neue Zeilen landen am Ende des Index, was für hochvolumige Write-Workloads relevant ist:
UUID id = UUID.ofEpochMillis(System.currentTimeMillis());
// Erste Bits enthalten den Millisekunden-Timestamp
// Sortiert korrekt, kein Index-Fragmentierung
AOT Object Caching (JEP 516)
Project Leyden bringt AOT Object Caching. Der HotSpot JVM kann gecachte Java-Objekte in ein GC-agnostisches Format laden. Was das für Spring Boot bedeutet: Tests mit dem PetClinic-Beispiel zeigen bis zu 41% schnellere Startup-Zeiten bei 21.000 vorgeladenen Klassen.
Der Cache funktioniert mit jedem Garbage Collector, auch mit ZGC. Für Container-Deployments und Serverless-Szenarien ist das relevant.
Soll man migrieren?
Java 26 ist kein LTS — Premier Support endet im September 2026. Für Produktionsworkloads bleibt Java 25 LTS die sichere Wahl.
Sinnvoll ist, Java 26 jetzt in der CI-Pipeline einzusetzen:
- JEP 500-Warnungen von Dependencies identifizieren
- Kompatibilität der eigenen Anwendung testen
- Bei Problemen rechtzeitig reagieren, bevor Java 27 kommt
Für neue Projekte auf Java 25 LTS bietet sich an, die Java 26-Preview-Features im Hinterkopf zu behalten. Structured Concurrency und Primitive Types in Patterns reifen mit jedem Release weiter und werden voraussichtlich in naher Zukunft finalisiert.
Spring Boot 4.0.x unterstützt offiziell Java 25. Java 26 funktioniert in der Praxis, ist aber noch nicht offiziell dokumentiert — das ändert sich vermutlich mit einem kommenden Patch-Release.
Fazit
Java 26 bringt für Spring Boot Entwickler zwei kostenlose Performance-Verbesserungen (G1 GC, AOT Caching), HTTP/3 im Standard-HttpClient, und eine wichtige Vorwarnung bezüglich Reflection auf final-Felder. Keine dieser Änderungen erfordert Code-Anpassungen — aber JEP 500 verdient Aufmerksamkeit in der CI-Pipeline, um zukünftige Kompatibilitätsprobleme frühzeitig zu erkennen.