Veröffentlichung von Java SE 23 und OpenJDK 23

Nach sechs Monaten Entwicklung hat die Firma Oracle die Plattform Java SE 23 (Java Platform, Standard Edition 23) veröffentlicht, deren Referenzimplementierung auf dem Open-Source-Projekt OpenJDK basiert. Abgesehen von der Entfernung einiger veralteter Funktionen bleibt die RĂŒckwĂ€rtskompatibilitĂ€t zu frĂŒheren Versionen von Java SE 23 erhalten – die meisten zuvor geschriebenen Java-Projekte werden ohne Änderungen unter der neuen Version funktionsfĂ€hig sein. Installierbare Builds von Java SE 22 (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 23 ist vollstĂ€ndig unter der GPLv2-Lizenz mit Ausnahmen fĂŒr GNU ClassPath verfĂŒgbar, die dynamisches Binden an kommerzielle Produkte erlauben.

Java SE 23 wird als Standardversion mit regulĂ€rem Support angesehen, fĂŒr die Updates bis zur nĂ€chsten Veröffentlichung bereitgestellt werden. FĂŒr eine Version mit langfristigem Support (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). Der erweiterte Support fĂŒr die LTS-Version von Java SE 8 wird bis 2030 fortgesetzt, wĂ€hrend Java SE 11 bis 2032 unterstĂŒtzt wird.

Zu den Neuerungen in Java SE 23 gehören:

  • Der generative Modus des Garbage Collectors ZGC (Generational Z Garbage Collector) ist standardmĂ€ĂŸig aktiviert, der eine separate Verarbeitung von „alten“ und „jungen“ Objekten verwendet, was die Effizienz bei der Bereinigung neu erstellter Objekte mit kurzer Lebensdauer erhöht. Der Einsatz des Generational ZGC verringert die Risiken von Pausen wĂ€hrend der Ressourcenallokation und senkt die CPU-Last sowie den Speicherverbrauch beim Garbage Collecting. Tests mit Generational ZGC in Apache Cassandra 4 zeigten eine vierfache Steigerung der Durchsatzrate bei festgelegter Heap-GrĂ¶ĂŸe und eine Reduzierung der Heap-GrĂ¶ĂŸe um ein Viertel bei unverĂ€ndertem Durchsatz.
  • In JavaDoc wurde die UnterstĂŒtzung fĂŒr die Verwendung von Markdown zur Dokumentation von Code in Kommentaren hinzugefĂŒgt, das anstelle einer Mischung aus HTML und @-Tags in JavaDoc verwendet werden kann.
    Veröffentlichung von Java SE 23 und OpenJDK 23
  • Die Mechanismen zum Abgleichen mit Muster wurden um eine vorlĂ€ufige UnterstĂŒtzung fĂŒr die Verwendung von primitiven Typen (int, byte, char und andere grundlegende Typen, die keine Objekte sind) in allen Arten von Vorlagen, im Operator „instanceof“ und in „switch“-Blöcken erweitert. switch (x.getStatus()) { case 0 -> „okay“; case 1 -> „warnung“; case 2 -> „fehler“; case int i -> „unbekannter status: „ + i; } if (i instanceof byte b) { 
 b 
 }
  • Es wurde eine vorlĂ€ufige UnterstĂŒtzung fĂŒr die Verwendung eines Ausdrucks „import module M“ hinzugefĂŒgt, um alle von dem angegebenen Modul exportierten Pakete auf einmal zu importieren. Diese Änderung vereinfacht erheblich die Wiederverwendbarkeit von Modulbibliotheken, da Bibliotheken und Klassen ohne Angabe ihres Standorts in der Paket-Hierarchie eingebunden werden können. Beispielsweise 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 zweite vorlĂ€ufige Implementierung der API Class-File wurde vorgeschlagen, um Java-Klassen-Dateien zu analysieren, zu generieren und zu transformieren. 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 achte vorlĂ€ufige Implementierung der API Vector wurde vorgeschlagen, die Funktionen fĂŒr Vektorberechnungen bereitstellt, die mithilfe von Vektorbefehlen der Prozessoren x86_64 und AArch64 durchgefĂŒhrt werden und gleichzeitig Operationen auf mehrere Werte gleichzeitig anwenden (SIMD). Im Gegensatz zu den vom JIT-Compiler HotSpot bereitgestellten Möglichkeiten zur automatischen Vektorisierung von Skalaren bietet die neue API die Möglichkeit, die Vektorisierung fĂŒr die parallele Datenverarbeitung explicit zu steuern.
  • Im Klasse java.io.Console wurden die Methoden format, printf, readPassword und readLine zum Formatieren, Ausgeben und Lesen von Text unter BerĂŒcksichtigung der gewĂ€hlten Locale hinzugefĂŒgt. System.console().printf(Locale.FRANCE, „%1$tY-%1$tB-%1$te %1$tA“, new Date()) 2024-mai-16 jeudi
  • Die zweite vorlĂ€ufige Implementierung der erweiterten Stream-API wurde hinzugefĂŒgt, die die Definition eigener Zwischenoperationen unterstĂŒtzt, die in FĂ€llen nĂŒtzlich sein können, in denen die vorhandenen eingebauten Zwischenoperationen nicht ausreichen, um die gewĂŒnschte Datenumwandlung durchzufĂŒhren. Eigene Handler werden durch die neue Zwischenoperation Stream::gather(Gatherer) angeschlossen, die die Stream-Elemente verarbeitet, indem sie den vom Benutzer definierten 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]]
  • Die dritte vorlĂ€ufige Implementierung versteckter Klassen und anonymen Instanzen der Methode „main“ wurde hinzugefĂŒgt, in denen auf öffentliche/static Deklarationen, die Übertragung eines Argumentarrays sowie auf andere mit der Klassendeklaration verbundene EntitĂ€ten verzichtet werden kann. // frĂŒher public class HelloWorld { public static void main(String[] args) { System.out.println(„Hello world!“); } } // jetzt kann man void main() { System.out.println(„Hallo, Welt!“); }
  • Eine zweite vorlĂ€ufige Möglichkeit wurde hinzugefĂŒgt, die angibt, dass in Konstruktoren AusdrĂŒcke vor dem Aufruf von super(
) verwendet werden, um den Konstruktor der ĂŒbergeordneten Klasse aus dem Konstruktor der abgeleiteten Klasse explizit aufzurufen, wenn diese AusdrĂŒcke nicht auf das durch den Konstruktor erstellte Exemplar verweisen. class Outer { void hello() { System.out.println(„Hallo“); } class Inner { Inner() { hello(); super(); } } }
  • Die dritte vorlĂ€ufige Implementierung von Scoped Values wurde hinzugefĂŒgt, die die gemeinsame Nutzung unverĂ€nderlicher Daten in Streams ermöglichen und einen effizienten Datenaustausch zwischen untergeordneten Streams bieten (Werte werden vererbt). Scoped Values werden entwickelt, um den Mechanismus der thread-lokalen Variablen zu ersetzen und sind effizienter bei der Verwendung einer sehr großen Anzahl virtueller Streams (Tausende und Millionen von Streams). Der Hauptunterschied zwischen Scoped Values und thread-lokalen Variablen besteht darin, dass erstere einmalig geschrieben werden, danach nicht mehr geĂ€ndert werden können und nur wĂ€hrend der AusfĂŒhrung des Streams verfĂŒgbar bleiben.
  • Der dritte vorlĂ€ufige Entwurf der API fĂŒr strukturierten Parallelismus (Structured Concurrency) wurde zum Testen vorgeschlagen, um die Entwicklung von Multithread-Anwendungen zu vereinfachen, indem mehrere Aufgaben, die in verschiedenen Threads ausgefĂŒhrt werden, als einheitlicher Block behandelt werden.
  • Die Methoden zum Zugriff auf den externen Speicher (außerhalb der JVM), die von der Klasse sun.misc.Unsafe bereitgestellt werden, wurden als veraltet erklĂ€rt und sollen entfernt werden. FĂŒr den Zugriff auf Off-Heap-Speicher und die Interaktion mit externem Code wird empfohlen, die APIs VarHandle und FFM (Foreign Function & Memory) zu verwenden.

ZusĂ€tzlich wurde das Update fĂŒr die Plattform zur Erstellung von JavaFX-Anwendungen 23 veröffentlicht und der GraalVM JIT-Compiler in die Hauptversion von Oracle JDK 23 integriert.

Ebenfalls wurde eine neue Version der universellen virtuellen Maschine GraalVM vorgestellt, die die AusfĂŒhrung von Anwendungen in JavaScript (Node.js), Python, Ruby, R, allen JVM-Sprachen (Java, Scala, Clojure, Kotlin) sowie Sprachen unterstĂŒtzt, fĂŒr die LLVM-Bitcode erzeugt werden kann (C, C++, Rust). Neben der UnterstĂŒtzung fĂŒr JDK 23 wurde in der neuen Version der Speicherverbrauch und die GrĂ¶ĂŸe des ausfĂŒhrbaren Codes optimiert, sowie eine vollstĂ€ndige UnterstĂŒtzung der Tools zur Einbettung von Python und WebAssembly in Java-Code unter Verwendung der JIT-Kompilierung implementiert.

Quelle: opennet.ru

60GB SSD 8Gb DDR4