Nach sechs Monaten Entwicklung hat Oracle die Plattform Java SE 24 (Java Platform, Standard Edition 24) veröffentlicht, deren Referenzimplementierung auf dem Open-Source-Projekt OpenJDK basiert. Abgesehen von der Entfernung einiger veralteter Funktionen bietet Java SE 24 RĂŒckwĂ€rtskompatibilitĂ€t zu frĂŒheren Versionen der Java-Plattform â die meisten zuvor geschriebenen Java-Projekte werden ohne Ănderungen unter der neuen Version lauffĂ€hig sein. Installationsfertige Builds von Java SE 24 (JDK, JRE und Server JRE) sind fĂŒr Linux (x86_64, AArch64), Windows (x86_64) und macOS (x86_64, AArch64) vorbereitet. Die im Rahmen des OpenJDK-Projekts entwickelte Referenzimplementierung von Java SE 24 ist vollstĂ€ndig unter der GPLv2-Lizenz mit Ausnahmen fĂŒr GNU ClassPath lizenziert, die dynamisches Linking mit kommerziellen Produkten erlauben.
Java SE 24 gehört zur Kategorie der Releases mit normaler UnterstĂŒtzung, fĂŒr die Updates bis zur nĂ€chsten Version bereitgestellt werden. FĂŒr eine Version mit langfristiger UnterstĂŒtzung (LTS) sollten Java SE 21 oder Java SE 17 verwendet werden, fĂŒr die Updates bis 2031 bzw. 2029 veröffentlicht werden (öffentliche Updates bis 2028 und 2026). Die erweiterte UnterstĂŒtzung fĂŒr die LTS-Version Java SE 8 wird bis 2030 fortgesetzt, wĂ€hrend Java SE 11 bis 2032 unterstĂŒtzt wird. Die nĂ€chste LTS-Version wird die Herbstveröffentlichung von Java SE 25 sein.
Zu den Neuerungen in Java SE 24 gehören:
- Ein experimenteller generativer Modus fĂŒr den Garbage Collector Shenandoah wurde vorgeschlagen, bei dem alte und neu erstellte Objekte getrennt verarbeitet werden, um die Effizienz der Bereinigung von Objekten mit kurzer Lebensdauer zu erhöhen. Der neue Modus bietet eine vorhersehbarere Durchsatzrate, StabilitĂ€t bei sich Ă€ndernden Lasten und eine Verringerung des Speicherverbrauchs wĂ€hrend der MĂŒllabfuhr. Der Scheduler von Shenandoah zielt darauf ab, die Ausfallzeiten wĂ€hrend der MĂŒllabfuhr durch die DurchfĂŒhrung gröĂerer Arbeitsmengen parallel zur AusfĂŒhrung von Java-Anwendungen zu reduzieren.
- In der HotSpot JVM wurde experimentelle UnterstĂŒtzung fĂŒr kompakte Objekt-Header implementiert, deren GröĂe auf 64-Bit-Systemen von 96 auf 64 Bit (von 12 auf 8 Byte) reduziert wurde. Die Verringerung der Header-GröĂe ermöglicht eine Reduzierung des Heap-Formats und erhöht die Cache-Effizienz.
- Im Garbage Collector G1 wurde die Implementierung der Barrieren vereinfacht, die den Zugriff von Anwendungen auf den Speicher ĂŒberwachen. In der neuen Version wurden die Operationen zur Erweiterung der Barrieren auf einen spĂ€teren Kompilierungsschritt im C2 JIT verschoben. DurchgefĂŒhrte Tests zeigen, dass diese Verschiebung die Overhead-Kosten im JIT-Compiler C2 je nach Anwendung um 10-20 % senken kann.
- Eine API fĂŒr die Verwendung kryptografischer SchlĂŒsselableitungsfunktionen (KDF, Key Derivation Function) wurde hinzugefĂŒgt, die es ermöglichen, zusĂ€tzliche SchlĂŒssel der erforderlichen LĂ€nge auf der Basis eines geheimen SchlĂŒssels (z. B. eines Passworts) und einer beliebigen Datenmenge zu generieren. Die KDF-API hat derzeit den Status einer Vorabversion (Preview).
- Es wurde die Möglichkeit zur vorausgreifenden (Ahead-of-Time) Lade- und Zusammenstellung von Klassen hinzugefĂŒgt. Diese Ănderung beschleunigt den Start der HotSpot JVM, indem die im Anwendung verwendeten Klassen bereits in einem geladenen und zusammengestellten Zustand bereitgestellt werden. Bei der ersten AusfĂŒhrung der Anwendung wird der Zustand aller Klassen im Cache gespeichert und bei nachfolgenden Starts zur Beschleunigung des Ladevorgangs verwendet.
- Eine API Class-File fĂŒr das Parsen, Generieren und Konvertieren von Java-Klassen-Dateien wurde hinzugefĂŒgt.
ClassFile cf = ClassFile.of(); ClassModel classModel = cf.parse(bytes); byte[] newBytes = cf.build(classModel.thisClass().asSymbol(), classBuilder -> { for (ClassElement ce : classModel) { if (!(ce instanceof MethodModel mm && mm.methodName().stringValue().startsWith("debug"))) { classBuilder.with(ce); } } });
- Eine erweiterte API Stream wurde hinzugefĂŒgt, die die Definition benutzerdefinierter Zwischenoperationen unterstĂŒtzt, die in FĂ€llen nĂŒtzlich sein können, in denen die vorhandenen eingebauten Zwischenoperationen nicht ausreichen, um die gewĂŒnschten Datenkonvertierungen durchzufĂŒhren. Benutzerdefinierte Handler werden ĂŒber die neue Zwischenoperation Stream::gather(Gatherer) angeschlossen, die die Elemente des Streams verarbeitet und den angegebenen benutzerdefinierten Handler anwendet. jshell > Stream.of(1,2,3,4,5,6,7,8,9).gather(new WindowFixed(3)).toList() $1 == > [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
- Es wurde eine vierte vorlĂ€ufige Implementierung der Scoped Values vorgeschlagen, die eine gemeinsame Nutzung unverĂ€nderlicher Daten in Threads ermöglichen und einen effizienten Datenaustausch zwischen untergeordneten Threads gewĂ€hrleisten (Werte werden vererbt). Scoped Values entwickeln sich als Ersatz fĂŒr das Mechanismus der thread-lokalen Variablen und sind effizienter im Einsatz von sehr vielen virtuellen Threads (Tausende und Millionen von Threads). Der Hauptunterschied zwischen Scoped Values und thread-lokalen Variablen besteht darin, dass erstere einmal geschrieben werden, danach nicht mehr verĂ€ndert werden können und nur zur Laufzeit des Threads verfĂŒgbar bleiben.
- In die Musterabgleichmechanismen wurde eine vorlĂ€ufige UnterstĂŒtzung fĂŒr die Verwendung primitiver Typen (int, byte, char und andere grundlegende Typen, die keine Objekte sind) in allen Arten von Vorlagen, im âinstanceofâ Operator und in âswitchâ Blöcken hinzugefĂŒgt. switch (x.getStatus()) { case 0 -> "okay"; case 1 -> "warning"; case 2 -> "error"; case int i -> "unbekannter Status: " + i; } if (i instanceof byte b) { ⊠b ⊠}
- Eine neunte vorlĂ€ufige Implementierung der Vector API wurde vorgeschlagen, die Funktionen fĂŒr vektorielle Berechnungen bereitstellt, die unter Verwendung von Vektor-Instruktionen der Prozessoren x86_64 und AArch64 ausgefĂŒhrt werden und es ermöglichen, Operationen gleichzeitig auf mehrere Werte anzuwenden (SIMD). Im Gegensatz zu den im JIT-Compiler HotSpot angebotenen Möglichkeiten zur Auto-Vektorisierung von skalaren Operationen, ermöglicht die neue API eine explizite Steuerung der Vektorisierung fĂŒr die parallele Datenverarbeitung.
- Die UnterstĂŒtzung fĂŒr die Synchronisierung virtueller Threads ohne deren Anheftung (Pinning) an plattformgebundene Threads wurde implementiert. Virtuelle Threads in einem synchronisierten Methoden- oder Ausdrucksb locking Zustand geben nun ihren Plattform-Thread frei, sodass andere virtuelle Threads ihn nutzen können, was die Anzahl der verfĂŒgbaren virtuellen Threads erheblich erhöht und die Skalierbarkeit von Anwendungen, die Multithreading verwenden, verbessert.
- Es wurde eine dritte vorlĂ€ufige Variante der Möglichkeit hinzugefĂŒgt, AusdrĂŒcke in Konstruktoren vor dem Aufruf von super(...) anzugeben, der fĂŒr den expliziten Aufruf des Konstruktors der Elternklasse aus dem Konstruktor der abgeleiteten Klasse verwendet wird, sofern diese AusdrĂŒcke nicht auf die vom Konstruktor erstellte Instanz verweisen. class Outer { void hello() { System.out.println("Hello"); } class Inner { Inner() { hello(); super(); } } }
- Die jlink-Utility unterstĂŒtzt jetzt die Erstellung von Laufzeit-Abbildern ohne die Verwendung von JMOD-Dateien, was die GröĂe des JDK um etwa 25 % reduziert.
- Eine zweite vorlĂ€ufige Variante zur Verwendung eines Ausdruks "import module M" wurde hinzugefĂŒgt, um alle von dem angegebenen Modul exportierten Pakete auf einmal zu importieren. Diese Ănderung erleichtert die Wiederverwendung von Modulbibliotheken erheblich, da Bibliotheken und Klassen ohne Angabe ihres Standorts in der Pakethierarchie eingebunden werden können. Zum Beispiel fĂŒhrt die Angabe "import module java.base" zum Import aller 54 Pakete, die im Modul java.base enthalten sind, die zuvor einzeln erwĂ€hnt werden mussten ("import java.io.*", "import java.util.*" usw.).
- Eine vierte vorlĂ€ufige Implementierung von implizit deklarierten Klassen und anonymen Instanzen der Methode "main" wurde hinzugefĂŒgt, bei der auf Deklarationen von public/static, die Ăbergabe eines Argumentarrays und andere mit der Klassendeklaration verbundene EntitĂ€ten verzichtet werden kann. // frĂŒher war public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } // jetzt ist es möglich void main() { System.out.println("Hello, World!"); }
- Ein vierter vorlĂ€ufiger Entwurf der API fĂŒr strukturierte ParallelitĂ€t (Structured Concurrency) wurde zur Erprobung vorgeschlagen. Diese API vereinfacht die Entwicklung von Multithread-Anwendungen, indem sie mehrere Aufgaben, die in verschiedenen Threads ausgefĂŒhrt werden, als einen einzelnen Block behandelt.
- Die APIs KeyPairGenerator, Signature und KeyFactory unterstĂŒtzen jetzt die Algorithmen ML-KEM (CRYSTALS-Kyber) und ML-DSA (CRYSTALS-Dilithium), die vom National Institute of Standards and Technology (NIST) standardisiert wurden und quantensicher sind. Diese Algorithmen nutzen kryptographische Methoden, die auf der Lösung von Gittertheorie-Problemen basieren, deren Lösungszeit sich auf herkömmlichen und quantencomputern nicht unterscheidet.
- Im Garbage Collector ZGC wurde die UnterstĂŒtzung des nicht-generativen Modus entfernt, der die Verarbeitung von "alten" und "jungen" Objekten nicht trennt. Ab Java SE 23 wird der generative Modus von ZGC standardmĂ€Ăig angewendet.
- Es wurden Warnungen bei der Verwendung der JNI (Java Native Interface) und FFM (Foreign Function & Memory) APIs hinzugefĂŒgt, um Entwickler auf die bevorstehende EinschrĂ€nkung des Zugriffs auf diese APIs vorzubereiten, da in einer der kommenden Versionen der IntegritĂ€tsmodus aktiviert wird, der standardmĂ€Ăig die Interaktion mit nativem Code verbietet.
- Es wurde eine Warnung aktiviert, wenn auf Methoden zum Zugriff auf externen Speicher (auĂerhalb der JVM) zugegriffen wird, die von der Klasse sun.misc.Unsafe bereitgestellt werden. FĂŒr den Zugriff auf Off-Heap-Speicher und die Interaktion mit externem Code wird empfohlen, die VarHandle-API zu verwenden. In der vorherigen Version wurde die UnterstĂŒtzung von sun.misc.Unsafe als veraltet gekennzeichnet.
- Der Security Manager wurde deaktiviert, der seit langem veraltet war und nach der Einstellung der UnterstĂŒtzung fĂŒr das Browser-Plugin nicht mehr benötigt wird. Der Security Manager wurde in Java 17 als veraltet eingestuft. In einer der kommenden Versionen ist geplant, den Security Manager vollstĂ€ndig zu entfernen.
- DerCode zur UnterstĂŒtzung der 32-Bit-Plattform von Windows auf x86-Systemen wurde entfernt. Der Port fĂŒr 32-Bit x86-Systeme wurde als veraltet erklĂ€rt und die UnterstĂŒtzung fĂŒr Linux auf 32-Bit x86-Systemen wird eingestellt.
ZusĂ€tzlich kann die Veröffentlichung eines Updates der Plattform fĂŒr die Erstellung von JavaFX-Anwendungen 24 sowie die neue Version der universellen GraalVM hervorgehoben werden, die die AusfĂŒhrung von Anwendungen in JavaScript (Node.js), Python, Ruby, R und allen Sprachen fĂŒr die JVM (Java, Scala, Clojure, Kotlin) sowie in Sprachen, die LLVM-Bitcode erzeugen können (C, C++, Rust) unterstĂŒtzt. Neben der UnterstĂŒtzung von JDK 24 wurden in der neuen GraalVM-Version Optimierungen fĂŒr Aufgaben im Zusammenhang mit maschinellem Lernen vorgenommen, die UnterstĂŒtzung fĂŒr die Kompilierung von Java-Bytecode in Maschinencode verbessert und ein Mechanismus namens SkipFlow hinzugefĂŒgt, um die GröĂe der ausfĂŒhrbaren Dateien zu reduzieren und die Kompilierzeit zu verkĂŒrzen.
Quelle: opennet.ru
