Nach sechsmonatiger Entwicklung hat die Firma Oracle plattforms (Java Platform, Standard Edition 15), dessen Referenzimplementierung das OpenJDK-Projekt nutzt. Java SE 15 gewĂ€hrleistet die AbwĂ€rtskompatibilitĂ€t mit frĂŒheren Versionen der Java-Plattform; alle zuvor geschriebenen Java-Projekte funktionieren ohne Ănderungen unter der neuen Version. Installationsfertige Builds von Java SE 15 (JDK, JRE und Server JRE) fĂŒr Linux (x86_64), Windows und macOS. Die Referenzimplementierung wurde im Rahmen des OpenJDK-Projekts entwickelt ist vollstĂ€ndig unter der GPLv2-Lizenz mit Ausnahmen von GNU ClassPath geöffnet, die dynamische Bindungen an kommerzielle Produkte erlauben.
Java SE 15 gehört zur Kategorie der Versionen mit gewöhnlichem Supportzeitraum, fĂŒr die Updates bis zur nĂ€chsten Veröffentlichung bereitgestellt werden. FĂŒr Versionen mit langfristigem Support (LTS) sollte Java SE 11 verwendet werden, fĂŒr die Updates bis 2026 bereitgestellt werden. Die vorherige LTS-Version, Java 8, wird bis Dezember 2020 unterstĂŒtzt. Die nĂ€chste LTS-Version wird fĂŒr September 2021 erwartet. Zur Erinnerung: Ab der Veröffentlichung von Java 10 ist das Projekt auf einen neuen Entwicklungsprozess umgestiegen, der einen kĂŒrzeren Zyklus fĂŒr die Erstellung neuer Versionen vorsieht. Neue Funktionen werden nun in einem durchgehend aktualisierten Master-Zweig entwickelt, der bereits fertige Ănderungen enthĂ€lt und von dem alle sechs Monate Zweige zur Stabilisierung neuer Versionen abgezweigt werden.
Aus :
- UnterstĂŒtzung des EdDSA-Signaturalgorithmus (Edwards-Curve Digital Signature Algorithm) ). Die vorgeschlagene EdDSA-Implementierung ist plattformunabhĂ€ngig, resistent gegen Angriffe ĂŒber SeitenkanĂ€le (alle Berechnungen erfolgen in konstanter Zeit) und ĂŒbertrifft hinsichtlich der Leistung die bestehende ECDSA-Implementierung, die in C geschrieben ist, bei gleichem Schutzniveau. Zum Beispiel zeigt EdDSA unter Verwendung einer elliptischen Kurve mit einem 126-Bit-SchlĂŒssel eine Leistung, die der von ECDSA mit der elliptischen Kurve secp256r1 und einem 128-Bit-SchlĂŒssel entspricht.
- Experimentelle UnterstĂŒtzung fĂŒr versiegelte (âsealedâ) Klassen und Schnittstellen, die von anderen Klassen und Schnittstellen nicht zur Vererbung, Erweiterung oder Ăberlagerung der Implementierung verwendet werden können. Versiegelte Klassen bieten auĂerdem eine deklarativere Möglichkeit, die Verwendung einer Superklasse zu beschrĂ€nken als Zugriffsmodifikatoren, indem sie explizit eine Liste von Unterklassen angeben, die zur Erweiterung zugelassen sind.
package com.example.geometry;
public sealed class Shape
permits com.example.polar.Circle,
com.example.quad.Rectangle,
com.example.quad.simple.Square {âŠ} - UnterstĂŒtzung fĂŒr versteckte Klassen, die nicht direkt von den Bytecodes anderer Klassen verwendet werden können. Der Hauptzweck versteckter Klassen besteht darin, in Frameworks verwendet zu werden, die wĂ€hrend der Laufzeit Klassen dynamisch generieren und diese indirekt ĂŒber . Solche Klassen haben normalerweise eine begrenzte Lebensdauer, weshalb ihre UnterstĂŒtzung fĂŒr den Zugriff aus statisch generierten Klassen nicht gerechtfertigt ist und nur zu einem erhöhten Speicherverbrauch fĂŒhrt. Versteckte Klassen ermöglichen auch den Verzicht auf die nicht standardmĂ€Ăige API sun.misc.Unsafe::defineAnonymousClass, die in Zukunft entfernt werden soll.
- Der Garbage Collector ZGC (Z Garbage Collector) wurde stabilisiert und als bereit fĂŒr den breiten Einsatz anerkannt. ZGC arbeitet im passiven Modus, minimiert so weit wie möglich Verzögerungen durch Garbage Collection (die Stop-Zeit bei Verwendung von ZGC ĂŒberschreitet 10 ms nicht) und kann sowohl mit kleinen als auch mit riesigen Haufen von mehreren hundert Megabyte bis hin zu vielen Terabyte arbeiten.
- Wurde stabilisiert und als bereit fĂŒr den breiten Einsatz anerkannt
Garbage Collector , der mit minimalen Unterbrechungen (Low-Pause-Time Garbage Collector) arbeitet. Shenandoah wurde von Red Hat entwickelt und zeichnet sich durch die Verwendung eines Algorithmus aus, der die Stop-Zeiten wĂ€hrend der Garbage Collection verringert, indem die Bereinigung parallel zur AusfĂŒhrung von Java-Anwendungen erfolgt. Die vom Garbage Collector verursachten Verzögerungen sind vorhersehbar und hĂ€ngen nicht von der HaufengröĂe ab, d.h. fĂŒr Haufen von 200 MB und 200 GB sind die Verzögerungen identisch ( nicht 50 ms und liegen normalerweise bei 10 ms); - Die UnterstĂŒtzung fĂŒr wurde stabilisiert und in die Sprache eingefĂŒhrt â eine neue Form von Zeichenliteralen, die es ermöglicht, mehrzeilige Textdaten in den Quellcode einzufĂŒgen, ohne Zeichen maskieren zu mĂŒssen, und die ursprĂŒngliche Formatierung des Textes im Block beizubehalten. Der Block wird durch drei doppelte AnfĂŒhrungszeichen umschlossen.
Zum Beispiel kann anstelle von
String html = "<HTML>" +
"\n\t" + "<BODY>" +
"\n\t\t" + "<H1>\"Java 15 ist da!\"</H1>" +
"\n\t" + "</BODY>" +
"\n" + "</HTML>";es kann angegeben werden:
String html = """
<HTML>
<BODY>
<H1>"Java 15\
ist da!"</H1>
</BODY>
</HTML>"""; - API Legacy DatagramSocket. Alte Implementierungen von java.net.DatagramSocket und java.net.MulticastSocket wurden durch eine moderne Implementierung ersetzt, die einfacher zu debuggen und zu warten ist und die mit den virtuellen Threads kompatibel ist, die im Rahmen des Projekts entwickelt werden. . Um mögliche KompatibilitÀtsprobleme mit bestehendem Code zu vermeiden, wurde die alte Implementierung nicht entfernt und kann mit der Option jdk.net.usePlainDatagramSocketImpl aktiviert werden.
- Eine zweite experimentelle Implementierung wurde vorgeschlagen im Operator âinstanceofâ, der es ermöglicht, sofort eine lokale Variable zum Zugriff auf den geprĂŒften Wert zu definieren. Zum Beispiel kann man sofort schreiben âif (obj instanceof String s && s.length() > 5) {.. s.contains(..) ..}â ohne die explizite Definition âString s = (String) objâ.
FrĂŒher:
if (obj instanceof Group) {
Group group = (Group) obj;
var entries = group.getEntries();
}Jetzt kann man auf die Definition âGroup group = (Group) objâ verzichten:
if (obj instanceof Group group) {
var entries = group.getEntries();
} - die zweite experimentelle Implementierung des SchlĂŒsselworts ââ, das eine kompakte Form zur Definition von Klassen bereitstellt, die es ermöglicht, ohne explizite Definition verschiedener Low-Level-Methoden wie equals(), hashCode() und toString() auszukommen, wenn die Daten nur in Feldern gespeichert werden und das Verhalten im Umgang mit ihnen unverĂ€ndert bleibt. Wenn in der Klasse typisierte Implementierungen der Methoden equals(), hashCode() und toString() verwendet werden, 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).
- der zweite Vorab-Entwurf der API fĂŒr den Zugriff auf fremden Speicher, der es Java-Anwendungen ermöglicht, sicher und effizient auf Speicherseiten auĂerhalb des Java-Haufs zuzugreifen, indem neue Abstraktionen wie MemorySegment, MemoryAddress und MemoryLayout verwendet werden.
- und die Technik der Biased Locking, die in der HotSpot JVM zur Reduzierung der Kosten durch Sperren verwendet wurde, wurde als veraltet erklÀrt. Diese Technik ist auf Systemen mit atomaren Anweisungen, die von modernen CPUs bereitgestellt werden, nicht mehr relevant und ist aufgrund ihrer KomplexitÀt zu wartungsintensiv.
- RMI Activation wurde , der in einer der nÀchsten Versionen entfernt wird. Es wird darauf hingewiesen, dass RMI Activation seit Java 8 als veraltet gilt und kaum noch in der modernen Praxis verwendet wird.
- Die JavaScript-Engine , die in Java SE 11 als veraltet erklÀrt wurde.
- Ports fĂŒr das Betriebssystem Solaris und SPARC-Prozessoren (Solaris/SPARC, Solaris/x64 und Linux/SPARC). Das Entfernen der angegebenen Ports wird der Community ermöglichen, die Entwicklung neuer Funktionen fĂŒr OpenJDK zu beschleunigen, ohne Zeit mit der Pflege von spezifischen Besonderheiten fĂŒr Solaris und SPARC zu verschwenden.
Quelle: opennet.ru
