Java 10 Funktionen

Java 10 ist das schnellste Release einer Java-Version in seiner 23-jährigen Geschichte. Java wurde für sein langsames Wachstum und seine Entwicklung kritisiert, aber Java 10 hat dieses Konzept geradezu zerstört. Java 10 ist ein Release mit vielen futuristischen Änderungen, deren Umfang und Auswirkungen möglicherweise nicht offensichtlich sind, aber weitreichend. In diesem Artikel werden wir die verschiedenen Funktionen besprechen, die im Java 10-Release hinzugefügt wurden. Bevor wir das tun, gehen wir einige Änderungen am Java-Veröffentlichungsmodell durch.

Modell für langfristige Unterstützung

Ab 2017 kündigten Oracle und die Java-Community ihren Wechsel zu einem neuen 6-Monats-Rhythmus für Java an. Es wechselte zu einem Modell für langfristige Unterstützung (LTS) für Oracle Java SE-Produkte. Was bedeutet das? LTS-Versionen der Produkte bieten erstklassige und nachhaltige Unterstützung von Oracle und werden alle 3 Jahre angestrebt. Jede Java-Veröffentlichung ist nach einem oder zwei Hauptmerkmalen modelliert, die die Veröffentlichung antreiben. Jedes Hindernis verschiebt die Veröffentlichung und kommt spät auf den Markt. Projekt Jigsaw war ein Hauptmerkmal von Java 9, es verschob die Veröffentlichungstermine mehrmals und die Veröffentlichung wurde um mehr als 1,5 Jahre verzögert. Die 6-Monats-Rhythmus-Veröffentlichung folgt einem Veröffentlichungszug. Der Veröffentlichungszug hat alle 6 Monate einen Zeitplan. Funktionen, die es schaffen, werden in den Zug einsteigen; sonst warten sie auf den nächsten geplanten Zug.

Oracle JDK vs Open JDK

Um benutzerfreundlicher zu sein, fördert Oracle & die Java-Community jetzt die OpenJDK-Binärdateien als primäre JDK für die Zukunft. Dies ist eine große Erleichterung gegenüber früheren Zeiten, in denen die JDK-Binärdateien proprietär und von Oracle lizenziert waren und verschiedene Einschränkungen bezüglich der Weiterverteilung hatten. Oracle wird jedoch weiterhin ihr JDK produzieren, jedoch nur für Langzeit-Supportversionen. Dies ist ein Schritt hin zu mehr Cloud- & Containerfreundlichkeit, da die OpenJDK-Binärdateien als Teil eines Containers verteilt werden können. Was bedeutet das? Die OpenJDK-Binärdateien werden alle 6 Monate veröffentlicht, während die Oracle JDK-Binärdateien alle 3 Jahre (LTS-Version) veröffentlicht werden. Welche JDK-Binärdateien werden übernommen? Große Organisationen benötigen Zeit, um zwischen den Versionen zu wechseln; sie halten an der Version fest, bis sie können. Die Branchenübernahme für Java 6 war größer als für Java 7, und dann bewegt sich die Branche allmählich zu Java 8. Meiner Meinung nach werden die LTS-Versionen von den Unternehmen am meisten bevorzugt. Allerdings ist noch nicht bekannt, ob es sich um die LTS-Version von Oracle JDK oder Open JDK handeln wird, zum Teil, weil sich viel im Cloud-Bereich tut. Java 9 & 10 sind Nicht-LTS-Versionen. Java 11, das im September 2018 erscheinen soll, wird eine LTS-Version sein.

Java 10 Funktionen

Lass uns einen Blick auf die Funktionen werfen, die in Java 10 verfügbar sind.

  1. Zeitbasierte Versionsveröffentlichung (JEP 322)

Mit der Einführung des zeitbasierten Freigabemodells hat Oracle das Versionszeichen schema der Java SE Platform und des JDK sowie relevante Versionsinformationen für gegenwärtige und zukünftige zeitbasierte Freigabemodelle geändert. Das neue Muster der Versionsnummer lautet: `$FEATURE.$INTERIM.$UPDATE.$PATCH` $FEATURE: Der Zähler wird alle 6 Monate erhöht und basiert auf Feature-Freigabeversionen, z. B.: JDK 10, JDK 11. $INTERIM: Der Zähler wird für nicht-Feature-Freigaben erhöht, die kompatible Fehlerbehebungen und Verbesserungen enthalten, aber keine inkompatiblen Änderungen. Normalerweise wird dies null sein, da es keine Zwischenfreigabe in einem Zeitraum von sechs Monaten geben wird. Dies wird für eine zukünftige Überarbeitung des Freigabemodells beibehalten. $UPDATE: Der Zähler wird für kompatible Update-Freigaben erhöht, die Sicherheitsprobleme, Regressionen und Fehler in neueren Funktionen beheben. Dies wird einen Monat nach der Feature-Freigabe und alle 3 Monate danach aktualisiert. Die Freigabe im April 2018 ist JDK 10.0.1, die Freigabe im Juli ist JDK 10.0.2 und so weiter $PATCH: Der Zähler wird für eine Notfallfreigabe erhöht, um ein kritisches Problem zu beheben. Neue APIs wurden hinzugefügt, um diese Zählerwerte programmgesteuert zu erhalten. Werfen wir einen Blick darauf;

Version version = Runtime.version();
version.feature();
version.interim();
version.update();
version.patch();

Jetzt werfen wir einen Blick auf den Java Launcher, der die Versionsinformationen zurückgibt:

$ java -version
java version "10" 2018-03-20
Java(TM) SE Runtime Environment 18.3 (build 10+46)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10+46, mixed mode)

Das Format der Versionsnummer ist „10“, da es keinen anderen Zähler gibt, der nicht null ist. Das Veröffentlichungsdatum wird hinzugefügt. 18.3 kann als das Jahr 2018 & 3. Monat gelesen werden, Build 10+46 ist der 46. Build für Version 10. Für einen hypothetischen Build 93 von JDK 10.0.1 lautet der Build 10.0.1+939. ### Lokale Variablentyp-Inferenz (JEP 286)

Die Lokale Variablentyp-Inferenz ist das größte neue Feature in Java 10 für Entwickler. Es fügt Typinferenz zu Deklarationen von lokalen Variablen mit Initialisierern hinzu. Die lokale Typinferenz kann nur in den folgenden Szenarien verwendet werden:

  • Beschränkt nur auf lokale Variable mit Initialisierer
  • Indizes der erweiterten for-Schleife oder Indizes
  • Lokal deklariert in for-Schleife

Schauen wir uns seine Verwendung an:

var numbers = List.of(1, 2, 3, 4, 5); // inferred value ArrayList
 // Index der erweiterten for-Schleife 
for (var number : numbers) {
	System.out.println(number);
}
 // Lokale Variable in einer Schleife deklariert 
for (var i = 0; i < numbers.size(); i++) {
	System.out.println(numbers.get(i));
}

Weitere Informationen dazu finden Sie in unserem exklusiven Beitrag zu java 10 lokale Variablentyp-Inferenz.

Diese Funktion ermöglicht es dem auf Java basierenden JIT-Compiler Graal, als experimenteller JIT-Compiler auf der Linux/x64-Plattform verwendet zu werden. Dies ist bisher die futuristischste Neuerung in der Java-10-Funktionsliste. Graal wurde in Java 9 eingeführt. Es ist eine Alternative zum JIT-Compiler, den wir gewohnt sind. Es ist ein Plugin für die JVM, was bedeutet, dass der JIT-Compiler nicht an die JVM gebunden ist und dynamisch durch ein anderes Plugin ersetzt werden kann, das JVMCI-kompatibel ist (Java-Level JVM Compiler Interface). Es bringt auch die Ahead-of-Time (AOT)-Kompilierung in die Java-Welt. Es unterstützt auch die Interpretation von polyglotten Sprachen. „Ein auf Java basierter Just-in-Time-Compiler, der in Java geschrieben wurde, um den Java-Bytecode in Maschinencode zu konvertieren.“ Ist es verwirrend? Wenn die JVM in Java geschrieben ist, benötigen Sie dann nicht eine JVM, um die JVM auszuführen? Die JVM kann AOT kompiliert werden, und dann kann der JIT-Compiler innerhalb der JVM verwendet werden, um die Leistung durch Live-Code-Optimierung zu verbessern. Graal ist eine komplette Neuschreibung des JIT-Compilers in Java von Grund auf. Der vorherige JIT-Compiler war in C++ geschrieben. Es gilt als eine der letzten Stufen der Evolution für jede Programmiersprache. Sie können zu Graal wechseln, indem Sie die folgenden JVM-Parameter verwenden:

-XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler

Weitere Informationen zu Graal finden Sie in der Präsentation von Chris Seaton.

Diese Funktion trägt zur Verbesserung des Start-Fußabdrucks bei und erweitert das vorhandene Class-Data-Sharing („CDS“)-Feature, um zu ermöglichen, dass Anwendungsklassen im gemeinsam genutzten Archiv abgelegt werden. Die JVM führt beim Start einige vorläufige Schritte aus, von denen das Laden von Klassen in den Speicher einer ist. Wenn mehrere JAR-Dateien mit mehreren Klassen vorhanden sind, ist die Verzögerung bei der ersten Anforderung deutlich sichtbar. Dies wird zu einem Problem bei der serverlosen Architektur, bei der die Startzeit kritisch ist. Um die Startzeit der Anwendung zu verkürzen, kann das Klassen-Daten-Sharing der Anwendung verwendet werden. Die Idee besteht darin, den Fußabdruck zu reduzieren, indem gemeinsame Klassenmetadaten über verschiedene Java-Prozesse hinweg geteilt werden. Dies kann durch die folgenden 3 Schritte erreicht werden: Bestimmung der zu archivierenden Klassen: Verwenden Sie den Java-Launcher, um eine Liste von Dateien zum Archivieren zu erstellen. Dies kann durch die folgenden Parameter erreicht werden:

$java -Xshare:off -XX:+UseAppCDS -XX:DumpLoadedClassList=hello.lst -cp hello.jar HelloWorld

Erstellen des AppCDS-Archivs: Verwenden Sie den Java-Launcher, um das Archiv der Liste von Dateien zu erstellen, die für das Anwendungs-CDS verwendet werden sollen. Dies kann durch folgende Parameter erreicht werden:

$java -Xshare:dump -XX:+UseAppCDS -XX:SharedClassListFile=hello.lst -XX:SharedArchiveFile=hello.jsa -cp hello.jar

Verwendung des AppCDS-Archivs: Verwenden Sie den Java-Launcher mit den folgenden Parametern, um das Anwendungs-CDS zu verwenden.

$java -Xshare:on -XX:+UseAppCDS -XX:SharedArchiveFile=hello.jsa -cp hello.jar HelloWorld
  1. Paralleler Voll-GC für G1 (JEP 307)

G1 Garbage Collector wurde in JDK 9 als Standard festgelegt. Der G1 Garbage Collector vermeidet jegliche vollständige Müllsammlung, aber wenn die gleichzeitigen Threads für die Sammlung den Speicher nicht schnell genug wiederherstellen können, wird die Benutzererfahrung beeinträchtigt. Diese Änderung verbessert die schlechteste Latenzzeit von G1, indem der Voll-GC parallelisiert wird. Der Mark-Sweep-Compact-Algorithmus des G1-Collectors wird im Rahmen dieser Änderung parallelisiert und wird ausgelöst, wenn die gleichzeitigen Threads für die Sammlung den Speicher nicht schnell genug wiederherstellen können.25. ### Garbage Collector Interface (JEP 304)

Dieses JEP ist eine zukunftsweisende Änderung. Es verbessert die Code-Isolation verschiedener Garbage Collector, indem es eine gemeinsame Garbage Collector-Schnittstelle einführt. Diese Änderung bietet eine bessere Modularität für den internen GC-Code. Sie wird in Zukunft das Hinzufügen neuer GC erleichtern, ohne den bestehenden Code zu ändern, und auch beim Entfernen oder Aufräumen des vorherigen GC helfen.26. ### Zusätzliche Unicode Language-Tag-Erweiterungen (JEP 314)

Diese Funktion erweitert java.util.Locale und zugehörige APIs, um zusätzliche Unicode-Erweiterungen von BCP 47-Sprachtags zu implementieren. Ab Java SE 9 werden die unterstützten BCP 47 U-Sprachtag-Erweiterungen „ca“ und „nu“ sein. Dieses JEP wird die Unterstützung für die folgenden zusätzlichen Erweiterungen hinzufügen:

  • cu (Währungstyp)
  • fw (erster Tag der Woche)
  • rg (Region Override)
  • tz (time zone)

Um diese zusätzlichen Erweiterungen zu unterstützen, werden Änderungen an verschiedenen APIs vorgenommen, um Informationen basierend auf U oder zusätzlichen Erweiterungen bereitzustellen.

java.text.DateFormat::get*Instance
java.text.DateFormatSymbols::getInstance
java.text.DecimalFormatSymbols::getInstance
java.text.NumberFormat::get*Instance
java.time.format.DateTimeFormatter::localizedBy
java.time.format.DateTimeFormatterBuilder::getLocalizedDateTimePattern
java.time.format.DecimalStyle::of
java.time.temporal.WeekFields::of
java.util.Calendar::{getFirstDayOfWeek,getMinimalDaysInWeek}
java.util.Currency::getInstance
java.util.Locale::getDisplayName
java.util.spi.LocaleNameProvider
  1. Root-Zertifikate (JEP 319)

Um OpenJDK zu fördern und für Community-Benutzer attraktiver zu machen, bietet diese Funktion einen Standard Satz von Stammzertifizierungsstellen (CA) Zertifikaten im JDK an. Dies bedeutet auch, dass sowohl Oracle- als auch OpenJDK-Binärdateien funktional gleich sein werden. Kritische Sicherheitskomponenten wie TLS werden standardmäßig in OpenJDK-Builds funktionieren.30. ### Thread-Local Handshakes (JEP 312)

Dies ist eine interne JVM-Funktion zur Verbesserung der Leistung. Ein Handshake-Vorgang ist ein Rückruf, der für jeden JavaThread ausgeführt wird, während sich dieser Thread in einem Safepoint-Zustand befindet. Der Rückruf wird entweder vom Thread selbst oder vom VM-Thread ausgeführt, während der Thread in einem blockierten Zustand gehalten wird. Diese Funktion bietet eine Möglichkeit, einen Rückruf auf Threads auszuführen, ohne einen globalen VM-Safepoint durchzuführen. Es wird sowohl möglich als auch kostengünstig, einzelne Threads anzuhalten und nicht nur alle Threads oder keinen.31. ### Heap-Allokation auf alternativen Speichergeräten (JEP 316)

Anwendungen haben einen hohen Speicherbedarf. Es gibt eine Zunahme von Cloud-native Anwendungen, In-Memory-Datenbanken und Streaming-Anwendungen. Um diesen Diensten gerecht zu werden, stehen verschiedene Speicherarchitekturen zur Verfügung. Diese Funktion erweitert die Fähigkeit von HotSpot VM, den Java-Objektheap auf einem alternativen Speichergerät, wie z.B. einem NV-DIMM, das vom Benutzer angegeben wird, zuzuweisen. Dieses JEP zielt auf alternative Speichergeräte ab, die die gleiche Semantik wie DRAM haben, einschließlich der Semantik atomarer Operationen, und daher anstelle von DRAM für den Objektheap verwendet werden können, ohne dass Änderungen am vorhandenen Anwendungscode erforderlich sind.32. ### Entfernen des Native-Header-Generierungstools – javah (JEP 313)

Es handelt sich hierbei um eine Aufräumänderung, um das javah-Tool aus dem JDK zu entfernen. Die Funktionalität des Tools wurde in javac als Teil von JDK 8 hinzugefügt, das die Möglichkeit bietet, native Header-Dateien zur Kompilierungszeit zu erstellen, wodurch javah überflüssig wird.35. ### Zusammenfassen des JDK-Forest in einem einzigen Repository (JEP 296)

Im Laufe der Jahre gab es verschiedene Mercurial-Repositories für den JDK-Code. Unterschiedliche Repositories bieten einige Vorteile, hatten aber auch verschiedene Betriebsnachteile. Im Rahmen dieser Änderung werden zahlreiche Repositories des JDK-Forest in einem einzigen Repository zusammengeführt, um die Entwicklung zu vereinfachen und zu optimieren.36. ### API-Änderungen

Java 10 hat API’s hinzugefügt und entfernt (Ja, es ist kein Tippfehler). Java 9 führte eine verbesserte Veraltungsphase ein, in der bestimmte API’s als entfernt in zukünftigen Versionen markiert wurden. Entfernte API’s: Sie können die entfernten API’s hier finden. Hinzugefügte API’s: In Java 10 wurden 73 neue API’s hinzugefügt. Sie können die hinzugefügten API’s zusammen mit einem Vergleich hier finden. Lassen Sie uns einige Ergänzungen durchgehen:

  • Listen-, Karten- und Mengenschnittstellen wurden mit einer statischen copyOf(Collection)-Methode hinzugefügt. Es gibt eine nicht modifizierbare Liste, Karte oder Menge zurück, die die bereitgestellten Einträge enthält. Für eine Liste wird, wenn die gegebene Liste anschließend geändert wird, die zurückgegebene Liste solche Änderungen nicht widerspiegeln.
  • Optional und seine primitiven Variationen erhalten eine Methode orElseThrow(). Dies ist genau dasselbe wie get(), jedoch gibt die Java-Dokumentation an, dass dies eine bevorzugte Alternative zu get() ist.
  • Die Collectors-Klasse erhält verschiedene Methoden zum Sammeln von nicht modifizierbaren Sammlungen (Set, Liste, Karte).
List actors = new ArrayList<>();
actors.add("Jack Nicholson");
actors.add("Marlon Brando");
System.out.println(actors); // prints [Jack Nicholson, Marlon Brando]
// Neue API hinzugefügt - Erstellt eine unveränderliche Liste aus einer Liste. 
List copyOfActors = List.copyOf(actors);
System.out.println(copyOfActors); // prints [Jack Nicholson, Marlon Brando]
// copyOfActors.add("Robert De Niro"); wird eine 
UnsupportedOperationException erzeugen. 
actors.add("Robert De Niro");
System.out.println(actors);// prints [Jack Nicholson, Marlon Brando, Robert De Niro]
System.out.println(copyOfActors); // prints [Jack Nicholson, Marlon Brando]
		
String str = "";
Optional name = Optional.ofNullable(str);
// Neue API hinzugefügt - ist eine bevorzugte Option gegenüber der Methode get(). 
name.orElseThrow(); // same as name.get()  

// Neue API hinzugefügt - Collectors.toUnmodifiableList 
List collect = actors.stream().collect(Collectors.toUnmodifiableList());
// collect.add("Tom Hanks"); // Wird eine 
UnsupportedOperationException erzeugen. 

Schlussfolgerung

In diesem Artikel haben wir die verschiedenen neuen Funktionserweiterungen von Java 10 durchlaufen. Wenn Sie denken, dass hier etwas Wichtiges fehlt, lassen Sie es uns bitte durch Kommentare wissen. Wie gewohnt können Sie den vollständigen Code auf GitHub hier überprüfen.

Source:
https://www.digitalocean.com/community/tutorials/java-10-features