Java SE 16 veröffentlicht

Nach sechs Monaten Entwicklung hat Oracle die Plattform Java SE 16 (Java Platform, Standard Edition 16) veröffentlicht, wobei das OpenJDK-Projekt als Referenzimplementierung verwendet wird. Java SE 16 bewahrt die Abwärtskompatibilität zu früheren Versionen der Java-Plattform, alle zuvor geschriebenen Java-Projekte werden ohne Änderungen unter der neuen Version funktionsfähig sein. Installierbare Bereitstellungen von Java SE 16 (JDK, JRE und Server JRE) sind für Linux (x86_64, AArch64), Windows und macOS vorbereitet. Die im Rahmen des OpenJDK-Projekts entwickelte Referenzimplementierung von Java 16 ist vollständig unter der GPLv2 mit Ausnahmen der GNU ClassPath lizenziert, die dynamisches Binden an kommerzielle Produkte zulassen.

Java SE 16 gehört zur Kategorie der Veröffentlichungen mit allgemeiner Unterstützung, Updates dafür werden bis zur nächsten Veröffentlichung bereitgestellt. Für eine Langzeit-Support-Version (LTS) sollte Java SE 11 verwendet werden, für die Updates bis 2026 bereitgestellt werden. Die nächste LTS-Version ist für September 2021 geplant. Es sei daran erinnert, dass mit der Veröffentlichung von Java 10 das Projekt auf einen neuen Entwicklungsprozess umgestiegen ist, der kürzere Zyklen für neue Releases vorsieht. Neue Funktionen werden nun in einem ständig aktualisierten Master-Zweig entwickelt, in den bereits fertige Änderungen aufgenommen werden und von dem alle sechs Monate Zweige zur Stabilisierung neuer Versionen abgezweigt werden.

Im Rahmen der Vorbereitung einer neuen Version wurde die Entwicklung von Mercurial auf Git und die Plattform GitHub umgestellt. Es wird erwartet, dass die Migration die Leistung der Repository-Operationen verbessert, die Effizienz der Speicherung erhöht, den Zugriff auf Änderungen über die gesamte Projektgeschichte ermöglicht, die Unterstützung für Code-Reviews verbessert und APIs zur Automatisierung von Arbeitsabläufen aktiviert. Darüber hinaus macht der Einsatz von Git und GitHub das Projekt für Neueinsteiger und Entwickler, die mit Git vertraut sind, attraktiver.

Zu den Neuerungen von Java 16 gehören:

  • Ein experimentelles Modul jdk.incubator.vector wurde hinzugefügt, das die Vector-API implementiert und Funktionen für Vektoroperationen bereitstellt, die mit Vektor-Instruktionen der Prozessoren x86_64 und AArch64 durchgeführt werden, wodurch gleichzeitig Operationen auf mehreren Werten (SIMD) angewendet werden können. Im Gegensatz zu den im HotSpot JIT-Compiler verfügbaren Möglichkeiten zur Autovektorierung skalaren Operationen ermöglicht die neue API eine explizite Steuerung der Vektorierung für die parallele Verarbeitung von Daten.
  • Im JDK- und VM HotSpot-Code, der in C++ geschrieben ist, wurde die Verwendung der in der C++14-Spezifikation neu hinzugekommenen Features erlaubt. Zuvor war die Verwendung der Standards C++98/03 gestattet.
  • Im Z Garbage Collector (ZGC), der im passiven Modus arbeitet und Verzögerungen durch die Müllsammlung so weit wie möglich minimiert, wurde die Möglichkeit zur parallelen Verarbeitung von Thread-Stacks ohne Unterbrechung der Ausführung von Anwendungs-Threads hinzugefügt. Im ZGC verbleiben nun nur noch die erforderlichen Unterbrechungen, die konstante Verzögerungen aufweisen, die normalerweise wenige Hundert Mikrosekunden nicht überschreiten.
  • Die Klassen SocketChannel, ServerSocketChannel und java.nio.channels unterstützen jetzt Unix-Sockets (AF_UNIX).
  • Ein Port für die Linux-Distribution Alpine mit der standardmäßigen C-Bibliothek musl wurde implementiert, der in Container-Umgebungen, Mikroservices, Cloud- und eingebetteten Systemen beliebt ist. Der vorgeschlagene Port ermöglicht das Ausführen von Java-Anwendungen wie herkömmliche Programme in solchen Umgebungen. Außerdem können mit jlink alle ungenutzten Module entfernt und eine minimale Umgebung erstellt werden, die für die Ausführung der Anwendung ausreichend ist, was die Erstellung anwendungsspezifischer kompakter Images ermöglicht.
  • Ein Mechanismus für Elastic Metaspace wurde implementiert, der die Speicherzuweisungs- und Rückgabeoperationen für die von Klassenmetadaten (Metaspace) belegte Speicher in der JVM HotSpot optimiert. Die Anwendung von Elastic Metaspace reduziert die Speicherfragmentierung, senkt die Overhead-Kosten im Klassenlader und hat zudem positive Auswirkungen auf die Leistung von lang laufenden Serveranwendungen, da der Speicher, der von ungenutzten Klassenmetadaten belegt wird, schneller an das Betriebssystem zurückgegeben wird. Um den Freigabemodus nach dem Entladen von Klassen auszuwählen, wurde die Option „-XX:MetaspaceReclaimPolicy=(balanced|aggressive|none)“ vorgeschlagen.
  • Ein JDK-Port für Windows-Systeme, die auf AArch64-Prozessorarchitektur basieren, wurde hinzugefügt.
  • Eine dritte Vorabversion der API Foreign-Memory Access wurde vorgeschlagen, die es Java-Anwendungen ermöglicht, sicher und effizient auf Speicherbereiche außerhalb des Java-Hauptspeichers zuzugreifen, indem neue Abstraktionen wie MemorySegment, MemoryAddress und MemoryLayout verwendet werden.
  • Eine experimentelle API Foreign Linker wurde implementiert, die den Zugriff auf nativen Code aus Java ermöglicht. Zusammen mit der API Foreign-Memory erleichtert die neue Programmierschnittstelle erheblich die Erstellung von Wrappers für herkömmliche gemeinsam genutzte Bibliotheken.
  • Das Dienstprogramm jpackage wurde hinzugefügt, das es ermöglicht, Pakete für selbstständige (self-contained) Java-Anwendungen zu erstellen. Das Dienstprogramm basiert auf javapackager aus JavaFX und ermöglicht die Erstellung von Paketen in Formaten, die für verschiedene Plattformen typisch sind (msi und exe für Windows, pkg und dmg für macOS, deb und rpm für Linux). Die Pakete enthalten alle erforderlichen Abhängigkeiten.
  • Strikte Kapselung aller internen Elemente des JDK ist jetzt standardmäßig aktiviert, mit Ausnahme kritischer APIs wie sun.misc.Unsafe. Der Wert der Option „—illegal-access“ ist jetzt standardmäßig auf „deny“ gesetzt, anstatt auf „permit“, was dazu führt, dass Zugriffsversuche aus dem Code auf die meisten internen Klassen, Methoden und Felder blockiert werden. Zur Umgehung dieser Einschränkung sollte die Option „—illegal-access=permit“ verwendet werden.
  • Die Implementierung des Musters in der „instanceof“-Anweisung wurde stabilisiert, die es ermöglicht, sofort eine lokale Variable für den Zugriff auf den geprüften Wert zu definieren. Zum Beispiel kann jetzt direkt „if (obj instanceof String s && s.length() > 5) {... s.contains(..) ...}“ geschrieben werden, ohne dass „String s = (String) obj“ explizit definiert werden muss. Vorher: if (obj instanceof Group) { Group group = (Group) obj; var entries = group.getEntries(); } Jetzt kann auf die Definition „Group group = (Group) obj“ verzichtet werden: if (obj instanceof Group group) { var entries = group.getEntries(); }
  • Die Implementierung des Schlüsselworts „record“, das eine kompakte Form zur Definition von Klassen bietet, wurde stabilisiert und ermöglicht es, auf eine explizite Definition verschiedener niedrigstufiger Methoden wie equals(), hashCode() und toString() zu verzichten, wenn die Daten nur in Feldern gespeichert werden, deren Verhaltensweise sich nicht ändert. Wenn eine Klassen die Standardimplementierungen von equals(), hashCode() und toString() verwendet, kann auf deren explizite Definition verzichtet werden: public record BankTransaction(LocalDate date, double amount, String description) {}

    Diese Ankündigung führt automatisch zur Implementierung der Methoden equals(), hashCode() und toString() zusätzlich zum Konstruktor und den Methoden, die die Datenänderung steuern (Getter).

  • Ein zweiter vorläufiger Entwurf von Versiegelten ("sealed") Klassen und Schnittstellen wurde vorgeschlagen, die von anderen Klassen und Schnittstellen nicht zum Erben, Erweitern oder Überschreiben von Implementierungen verwendet werden können. Versiegelte Klassen bieten auch eine deklarative Möglichkeit, die Verwendung der Überklasse einzuschränken, die über Zugriffsmodifikatoren hinausgeht, indem sie explizit Subklassen auflisten, die für die Erweiterung zulässig sind. package com.example.geometry; public sealed class Shape permits com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square {…}

Quelle: opennet.ru

60GB SSD 8Gb DDR4