Java SE 25 LTS und OpenJDK 25 veröffentlicht

Nach sechs Monaten Entwicklung hat Oracle die Plattform Java SE 25 (Java Platform, Standard Edition 25) veröffentlicht, bei der das Open-Source-Projekt OpenJDK als Referenzimplementation dient. Abgesehen von der Entfernung einiger veralteter Funktionen behält Java SE 25 die Abwärtskompatibilität zu früheren Versionen der Java-Plattform bei – die meisten zuvor geschriebenen Java-Projekte werden ohne Änderungen unter der neuen Version lauffähig sein. Installationsbereite Builds von Java SE 25 (JDK, JRE und Server JRE) sind für Linux (x86_64, AArch64), Windows (x86_64) und macOS (x86_64, AArch64) verfügbar. Die im Rahmen des OpenJDK-Projekts entwickelte Referenzimplementation von Java SE 25 ist vollständig unter der GPLv2-Lizenz mit Ausnahmen von GNU ClassPath verfügbar, die dynamische Bindung an kommerzielle Produkte erlauben.

Java SE 25 gehört zu den Versionen mit längerer Unterstützung, für die Updates bis 2033 veröffentlicht werden (öffentliche Updates erscheinen bis September 2030). Die LTS-Versionen, nämlich Java SE 17 und 21, werden ebenfalls weiterhin unterstützt, mit Updates, die bis 2029 und 2031 bereitgestellt werden (öffentliche Updates bis 2026 und 2028). Die erweiterte Unterstützung der LTS-Versionen Java SE 8 und 11 wird bis 2030 bzw. 2032 fortgesetzt.

Zu den Neuerungen in Java SE 25 gehören (1, 2, 3, 4):

  • Eine experimentelle API StableValue wurde hinzugefügt, um mit Objekten zu arbeiten, die unveränderliche Daten enthalten und in der JVM als Konstanten verarbeitet werden. Auf solche Objekte werden Leistungsoptimierungen angewendet, die mit Feldern, die das Schlüsselwort „final“ verwenden, vergleichbar sind. Die stabile API trennt die Erstellung konstanter Werte von deren Initialisierung, stellt sicher, dass ein Wert nur einmal initialisiert werden kann, reduziert die Startzeit von Programmen und ermöglicht die Anwendung von Optimierungen zur Konstantenverknüpfung (constant-folding) im Benutzercode, die zuvor nur im internen JDK-Code verwendet wurden. class Application { // Früher: // static final UserService USERS = new UserService(); // Jetzt: // static final StableValue USERS = StableValue.of(); public static UserService users() { return USERS.orElseSet(UserService::new); } }
  • Eine experimentelle API zum Kodieren und Dekodieren von Objekten mit kryptografischen Schlüsseln, Zertifikaten und Zertifikat-Rückruflisten wurde hinzugefügt, die das PEM-Format (Privacy-Enhanced Mail) verwenden.
  • Die Unterstützung für Scoped Values wurde hinzugefügt, die es ermöglichen, unveränderliche Daten in Streams gemeinsam zu nutzen und den Datenaustausch zwischen untergeordneten Threads effizient zu gestalten (Werte werden vererbt). Scoped Values entwickeln sich als Ersatz für Thread-local-Variablen und sind effizienter, wenn eine sehr große Anzahl von virtuellen Threads verwendet wird (tausende bis Millionen von Threads). Der Hauptunterschied zwischen Scoped Values und Thread-local-Variablen besteht darin, dass erstere einmal geschrieben werden, danach nicht mehr geändert werden können und nur zur Laufzeit des Threads verfügbar sind.
  • Ein API zur Verwendung kryptografischer Schlüsselableitungsfunktionen (KDF, key derivation function) wurde hinzugefügt, die es ermöglichen, zusätzliche Schlüssel der erforderlichen Länge auf Basis eines geheimen Schlüssels (zum Beispiel eines Passworts) und einer beliebigen Datenmenge zu generieren.
  • Der Code und die Build-Skripte zur Unterstützung von 32-Bit-x86-Systemen wurden entfernt. Die Einstellung der Unterstützung für 32-Bit-x86-Systeme hat die Infrastruktur für die Erstellung und das Testen des JDK vereinfacht und die Umsetzung plattformspezifischer Funktionen ohne die Notwendigkeit von Fallback-Handlers für 32-Bit-x86-Systeme ermöglicht.
  • Die Möglichkeit, mit einer einzigen Anweisung «import module M» alle von dem angegebenen Modul exportierten Pakete zu importieren, wurde hinzugefügt. Diese Änderung vereinfacht erheblich die Wiederverwendbarkeit von Modulbibliotheken, 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.).
  • Es wurde eine kompakte Variante zur Programmgestaltung vorgeschlagen, die sich als nützlich für das Lernen und die Entwicklung kleiner Anwendungen erweisen kann. In der kompakten Form ist keine Definition zusätzlicher Klassen erforderlich, standardmäßige APIs werden automatisch importiert und vereinfachte Ein-/Ausgabemethoden sind verfügbar. Zum Beispiel kann die Anwendung „Hello, World!“ auf Folgendes reduziert werden: void main() { IO.println(„Hello, World!“); }
  • Es ist erlaubt, in Konstruktoren Ausdrücke vor dem Aufruf von super(…) anzugeben, die verwendet werden, um den Konstruktor der Elternklasse explizit aus dem Konstruktor der abgeleiteten Klasse aufzurufen, sofern diese Ausdrücke keinen Bezug auf die durch den Konstruktor erstellte Instanz nehmen. class Outer { void hello() { System.out.println(„Hello“); } class Inner { Inner() { hello(); super(); } } }
  • Der generative Modus des Shenandoah-Garbagesammlers wurde hinzugefügt, in dem alte und neu erstellte Objekte separat bearbeitet werden, um die Effizienz der Bereinigung von Objekten mit kurzer Lebensdauer zu steigern. Der neue Modus sorgt für eine vorhersehbarere Durchsatzrate, Widerstandsfähigkeit gegenüber Laständerungen und eine Reduzierung des Speicherverbrauchs während der Garbage Collection. Der Shenandoah-Planer zielt darauf ab, die Ausfallzeiten während der Garbage Collection durch die Durchführung eines größeren Arbeitsvolumens parallel zu den laufenden Java-Anwendungen zu reduzieren.
  • Die Erstellung eines Caches für die Ahead-of-Time (AOT)-Lade- und Kompilierungsfunktion wurde vereinfacht, was den Start der HotSpot JVM beschleunigt, indem Klassen im bereits geladenen und kompilierten Zustand genutzt werden. Beim Start sind keine separaten Operationen zur Aufzeichnung von Aktivitäten und zur Erstellung eines Caches mehr erforderlich, es reicht ein einziger Befehl: java -XX:AOTCacheOutput=app.aot -cp app.jar com.example.App …
  • Bei der HotSpot Java VM wird die Möglichkeit zur Nutzung von Ausführungsprofilen eingebaut, die bei der letzten Ausführung der Anwendung gewonnen wurden. Diese Änderung ermöglicht es dem JIT-Compiler, auf die Erfassung von Statistiken zu verzichten und sofort mit der Generierung von nativen Code zu beginnen, ohne auf die Erstellung des Profils zu warten.
  • In der HotSpot JVM wurde die 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 Verkleinerung der Header-Größe trägt dazu bei, den Heap-Speicher zu verkleinern und die Effizienz des Caches zu erhöhen.
  • Eine Testimplementierung der API Vector wurde vorgeschlagen, die Funktionen für Vektorberechnungen bereitstellt, die mit Hilfe von Vektorbefehlen der x86_64- und AArch64-Prozessoren durchgeführt werden und gleichzeitig Operationen auf mehreren Werten (SIMD) anwenden können. Im Gegensatz zu den vom JIT-Compiler HotSpot angebotenen Möglichkeiten zur automatischen Vektorisierung von Skalaren, ermöglicht die neue API eine explizite Steuerung der Vektorisierung für die parallele Datenverarbeitung.
  • Der fünfte vorläufige Entwurf der API für strukturierten Parallelismus (Structured Concurrency) wurde zur Testung vorgeschlagen. Dieser vereinfacht die Entwicklung von Multithread-Anwendungen, indem er mehrere Aufgaben, die in verschiedenen Threads ausgeführt werden, als eine Einheit behandelt.
  • Im Musterabgleich wurde der dritte vorläufige Entwurf vorgestellt, der 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 ermöglicht. switch (x.getStatus()) { case 0 -> "okay"; case 1 -> "warning"; case 2 -> "error"; case int i -> "unknown status: " + i; } if (i instanceof byte b) { … b … }
  • Im JDK Flight Recorder (JFR) wurde experimentelle Unterstützung für das Protokollieren mit genauerer Nachverfolgung des CPU-Ressourcenverbrauchs auf der Linux-Plattform hinzugefügt. Informationen über die Ausführungszeit verschiedener Konstruktionen können anschaulich mit farbigen Diagrammen namens „FlameGraph“ visualisiert werden.
  • Die Stabilität des JDK Flight Recorders (JFR) beim asynchronen Sampling von Java-Thread-Stacks wurde verbessert, indem der Aufrufstack nur an „sicheren Punkten“ (safepoints) umgangen wird.
  • Im JDK Flight Recorder (JFR) wurden Werkzeuge zur Verfolgung und Bewertung der Ausführungszeit von Methoden hinzugefügt. Die Verfolgung des Aufrufstapels bestimmter Methoden sowie die Erfassung präziser Statistiken zu Methodenaufrufen, einschließlich Metriken wie Ausführungszeit und Anzahl der Aufrufe, wird unterstützt.

Quelle: opennet.ru

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster