Java Wochenrückblick #2: FFM Native-Memory-Pools bringen 18-fache Beschleunigung, strukturierte Nebenläufigkeit und dynamisches ZGC für JDK 28 bestätigt

Java · Weekly #2

Java Wochenrückblick #2: FFM Native-Memory-Pools bringen 18-fache Beschleunigung, strukturierte Nebenläufigkeit und dynamisches ZGC für JDK 28 bestätigt

javaJavaWochenrückblickFFMstrukturierte NebenläufigkeitZGC

Quellen:GitHub Releases + 官方博客 + HN

📦 Versions-Updates

Die aktuellste allgemein verfügbare (General Availability) stabile Version ist Java SE 27 (JDK 27), die am 15. September 2026 offiziell freigegeben wurde. Der Entwicklungszweig JDK 28 befindet sich derzeit in der Early-Access-Phase (EA).

Als reguläres halbjährliches Feature-Release brachte JDK 27 wesentliche Anpassungen im Speicherlayout und den Standardrichtlinien der Laufzeitumgebung:

JEP-Nr.Feature-NameÄnderung der StandardrichtlinieKernnutzen
JEP 534Compact Object HeadersStandardmäßig aktiv (64-Bit-Architekturen)Objekt-Header von 96 Bit auf 64 Bit reduziert, Heap-Speicherbedarf um 15 % bis 20 % gesenkt
JEP 523G1 as Default GC EverywherePlattform- und ressourcenübergreifender StandardBeendet den Serial-GC-Rückfall in kleinen Speichercontainern; deutliche Vorteile bei Pausenzeit und Durchsatz
JEP 527Post-Quantum Hybrid TLS 1.3Standardmäßige Aushandlung hybrider ML-KEM-SchlüsselSchützt vor „Jetzt abfangen, später entschlüsseln“-Quantenrisiken bei voller klassischer ECDH-Kompatibilität

Die Einführung von JEP 534 verschafft containerisierten Umgebungen erhebliche Heap-Einsparungen. Bei Workloads mit massenhaft kleinen und kurzlebigen Objekten verringern kompakte Header Cache-Line-Konflikte und verzögern Garbage-Collection-Zyklen merklich. Gleichzeitig beendet JEP 523 die veraltete Regel, wonach Container mit weniger als 2 GB RAM auf den Serial GC zurückfielen. HotSpot nutzt nun in allen Szenarien einheitlich die optimierte G1-Engine.

Detaillierte Benchmarks und Migrationsanalysen finden Sie in unserem Leitartikel: JDK 27 im Detail.


📝 Vertiefende Einblicke

1. FFM-API führt native Speicherpools ein: Latenz kleinster Allokationen fällt auf Nanosekundenbereich

  • Was ist passiert: Am 5. Oktober präsentierte OpenJDK-Kernentwickler Per-Åke Minborg signifikante Verbesserungen an der Foreign Function & Memory (FFM) API für JDK 28 (JDK-8385697 und PR #31365). Die neue Implementierung stattet Confined Arenas mit einem 64-Byte-Nativen-Speicherpool aus. Fordert ein Programm über Arena.ofConfined() kleine Speichersegmente an, schneidet die JVM diese direkt aus thread-lokalen Caches heraus und stellt sie nach Verlassen des Gültigkeitsbereichs zurück. Für virtuelle Threads wurde ein Ausleihmechanismus etabliert, der Puffer temporär vom Träger-Thread (Carrier Thread) entleiht und sofort wieder entkoppelt, um separaten Speicher-Overhead für Millionen virtueller Threads zu verhindern.
  • Warum das wichtig ist: Systemaufrufe und Lock-Konflikte beim Aufruf nativer C-Funktionen mit kleinen Objekten werden vollständig eliminiert. Benchmarks zeigen, dass Allokationen von 5 Byte auf macOS AArch64 um das 18,6-Fache beschleunigt werden (Latenz sinkt von 15,86 ns/op auf 1,05 ns/op), auf Windows x64 um das 16,8-Fache und auf Linux AArch64 um das 12,3-Fache. In virtuellen Threads schrumpft die Latenz von 15,67 ns auf 3,22 ns. Unternehmenscode benötigt keinerlei Änderungen; das bloße Laufzeit-Upgrade genügt für den Durchsatzgewinn.
  • Wen es betrifft: Teams, die jextract für native Bindings nutzen, Low-Level-Systementwickler mit häufigen C/C++-Aufrufen sowie Entwickler von Middleware zur Netzwerkpaket-Deserialisierung.

2. Entkopplung von Startzeit und dynamischer Dimensionierung: JEP 545 und JEP 546 zur Prüfung eingereicht

  • Was ist passiert: Am 7. Oktober reichte Erik Österlund aus dem HotSpot-GC-Team zwei eng verknüpfte Vorschläge ein: JEP 545 (Faster Startup and Warmup with ZGC) und JEP 546 (Adaptive Heap Sizing for ZGC), deren Prüffrist am 14. Oktober endet. JEP 545 reduziert die anfängliche physische Speicheranforderung von ZGC beim Start von statischen Großblöcken auf standardmäßig lediglich 2 MB, gefolgt von einer schnellen Hintergrundallokation. JEP 546 führt einen globalen adaptiven Algorithmus ein, der den Heap dynamisch an Auslastung und Systemressourcenkonkurrenz anpasst.
  • Warum das wichtig ist: Der klassische Zielkonflikt extrem latenzarmer Kollektoren zwischen subsekundärem Kaltstart und maximalem Durchsatz nach dem Aufwärmen wird aufgelöst. Früher beanspruchte die Voraballokation von 32 GB Heap über 10 Sekunden für physische Betriebssystemseiten. Ein 2-MB-Start erlaubte zwar den Start in 0,1 Sekunden, litt anschließend jedoch unter langsamen sequentiellen Speicheranforderungen. Im Zusammenspiel ermöglichen beide JEPs eine Reaktionszeit von unter 0,1 Sekunden auf den ersten Request, während ungenutzter Speicher im Mehrmandantenbetrieb dynamisch an das Betriebssystem zurückgegeben wird, was OOM-Kills zuverlässig verhindert.
  • Wen es betrifft: Cloud-native Serverless-Entwickler, Kubernetes-Multitenancy-Architekten und SRE-Teams extrem latenzkritischer Finanzhandelsplattformen.

3. Strukturierte Nebenläufigkeit vor Finalisierung: JEP 543 beendet sieben Preview-Runden

  • Was ist passiert: Unter der Leitung von Alan Bateman, Viktor Klang und Ron Pressler wurde JEP 543 (Structured Concurrency) am 6. Oktober offiziell als finales Feature (Targeted) für JDK 28 vorgeschlagen. Die Begutachtungsphase läuft bis zum 13. Oktober. Nach sieben kontinuierlichen Iterationen seit JDK 21 übernimmt der Vorschlag unverändert alle API-Signaturen aus JDK 27 in den endgültigen Standard.
  • Warum das wichtig ist: Das zentrale Kontrollwerkzeug des Project-Loom-Ökosystems legt den Schalter --enable-preview endgültig ab. StructuredTaskScope garantiert lexikalische Gültigkeitsbereiche für asynchrone Arbeitsabläufe und fasst parallele Unteraufgaben zu einer atomaren Einheit zusammen. Schlägt ein Teilprozess fehl oder läuft ein Timeout ab, sendet der Scope automatisch Abbruchsignale, verhindert verwaiste Threads und erhält kausale baumartige Stacktraces in Thread-Dumps.
  • Wen es betrifft: Entwickler hochparalleler API-Gateways und Betreuer führender Frameworks (wie Spring Boot, Quarkus und Micronaut) bei der Abstimmung auf virtuelle Thread-Lebenszyklen.

4. IBM und Red Hat starten Project Lightwell: Backports für über 400 Schwachstellen in Open-Source-Java-Bibliotheken

  • Was ist passiert: IBM und Red Hat stellten am 6. Oktober ihre gemeinsame Open-Source-Sicherheitsinitiative Lightwell sowie den Prüfdienst Lightwell Clearinghouse vor. Das Vorhaben deckte über 400 bisher unveröffentlichte Schwachstellen in weitverbreiteten Java-Bibliotheken auf und speiste alle Fehlerbehebungen über Responsible-Disclosure-Prozesse in die jeweiligen Upstream-Projekte ein.
  • Warum das wichtig ist: Schutz vor autonomen KI-Angriffsagenten, die scheinbar unbedenkliche Einzelschwachstellen zu komplexen Angriffsketten kombinieren. Ein zentrales Merkmal der Initiative ist das Backporting: Sicherheitskorrekturen werden gezielt auf ältere, in Produktion befindliche Abhängigkeiten zurückportiert. So können Unternehmen geschäftskritische Systeme härten, ohne destruktive API-Änderungen durch Major-Upgrades in Kauf nehmen zu müssen.
  • Wen es betrifft: Unternehmensarchitekten und Anwendungssicherheitsverantwortliche in traditionellen Branchen wie Banken und Telekommunikation, die langlebige Java-Altsysteme betreuen.

1. Microsoft Brewlet vorgestellt: Java-Workloads auf Kubernetes ganz ohne Container-Images ausführen

  • Kennzahlen: Fachvortrag auf der Devoxx Belgium; Hacker-News-Thread mit 10 Punkten und 2 Kommentaren.
  • Kernkontroverse: Microsoft Principal PM Bruno Borges präsentierte das Open-Source-Projekt Brewlet. Inspiriert vom agentenbasierten Modell aus WebAssembly können Entwickler JAR-Archive oder JPMS-Module direkt in OCI-Registries ablegen. Diese werden unmittelbar von einem auf den Kubernetes-Knoten vorinstallierten JDK ausgeführt, wodurch Dockerfiles und das Bauen von Betriebssystem-Image-Layern entfallen.
    • Befürworter-Position: Erleichterung von der Flut an CVE-Warnungen aus Basis-Images. Die Bereitstellungsgröße sinkt von Hunderten Megabyte auf wenige Dutzend Megabyte reiner Business-JARs, was CI/CD-Pipelines stark beschleunigt.
    • Kritiker-Position: Das Teilen eines knotenweiten JDKs bricht das Prinzip der isolierten, unveränderlichen Container-Umgebung. Geringste Verhaltensabweichungen durch Node-JDK-Updates können zu Umgebungsverunreinigungen und Kompatibilitätsbrüchen zwischen Anwendungen führen.

2. Daniel Lemire analysiert SIMD-Optimierung in Java und die Grenzen der Vector-API

  • Kennzahlen: Analysebeitrag im Tech-Blog von Daniel Lemire; Hacker-News-Thread mit 11 Punkten und 5 Kommentaren.
  • Kernkontroverse: Performance-Experte Daniel Lemire rezensierte das Buch Mastering SIMD with Java Vector API von Roman Snytsar. Er betonte, dass jdk.incubator.vector den Single-Core-Durchsatz bei bestimmten Algorithmen zwar vervielfacht, seine schwergewichtige Abstraktion bei asymmetrischen Schleifen oder unpassenden Speichergrenzen jedoch leicht strukturelle CPU-Hazards hervorruft.
    • Befürworter-Position: In throughput-kritischen Feldern wie Vektorsuche, Datenbank-Engines und High-Performance-Computing ist handgeschriebener SIMD-Code unerlässlich, um moderne Prozessorinstruktionen voll auszuschöpfen.
    • Kritiker-Position: Da das Inkubatormodul langlebig und API-Änderungen unterworfen bleibt, ist die Kopplung im Produktionscode mit untragbaren Wartungskosten verbunden. Standardanwendungen sollten sich auf die JIT-Auto-Vektorisierung stützen und auf Wertobjekte aus Project Valhalla zur hardwarenahen Array-Verflachung warten.

3. Rust-basiertes JVM-Build-Tool jrs: Kann das Cargo-Paradigma Maven und Gradle Paroli bieten?

  • Kennzahlen: Offizielle Website getjrs.dev; Hacker-News-Diskussion mit 2 Punkten und 1 Kommentar.
  • Kernkontroverse: Entwickler Piotr Wittchen stellte das in Rust geschriebene Build-Tool jrs vor. Mit einer schlanken jrs.toml-Konfiguration, deterministischem Lockfile, ohne JVM-Startverzögerung und als einzelnes Binary konzipiert, will es Entwickler überzeugen.
    • Befürworter-Position: Eine willkommene Alternative für alle, die komplexe Maven-pom.xml-Dateien und schwer debuggbare Gradle-Groovy/Kotlin-DSLs satthaben. Eine einzige statische Datei genügt für Auflösung und Paketierung.
    • Kritiker-Position: jrs unterstützt keine Plugins, keine Multi-Module-Reaktoren und keine flexiblen Lifecycle-Hooks. Für Unternehmens-Monorepos und maßgeschneiderte Codegenerierung ist es unzureichend und bleibt auf isolierte Kleinprojekte beschränkt.

📅 Was nächste Woche ansteht

  1. Prüffrist für JEP 543 (Strukturierte Nebenläufigkeit) endet (13. Oktober): Nach Abschluss der Review-Phase wird die Aufnahme in JDK 28 finalisiert. Damit erreichen beide Kernpfeiler von Project Loom (virtuelle Threads und strukturierte Nebenläufigkeit) den regulären Produktionsstatus.
  2. Prüffrist für JEP 545 und JEP 546 (ZGC-Speicherinnovation) endet (14. Oktober): Die beiden Vorschläge zur Beschleunigung der Startzeit und elastischen Heap-Anpassung schließen die Prüfung ab und wechseln in die Code-Integration.
  3. Fortschritte bei Project-Valhalla-EA-Builds: Nach dem Merge von JEP 401 (Value Objects) in die Hauptlinie richtet sich das Augenmerk auf reale Speicherverflachungs-Benchmarks in den kommenden JDK 28 EA-Builds.