Zusammenfassung der neuen Funktionen von Java 14

Java 14 wurde am 17. März 2020 veröffentlicht. Java SE 14 Platform JSR 389

herunterladen

Sie können es von der OpenJDK-Site herunterladen. https://jdk.java.net/14/

SDKMAN! wird für die Installation unter Mac und Linux empfohlen

Neben dem Oracle Open JDK gibt es die folgenden Distributionen, die kostenlos kommerziell verwendet werden können.

Da es sich nicht um LTS handelt, scheint es nicht auf Amazon Corretto veröffentlicht zu sein. Das Update wird im April mit 14.0.1 und im Juli mit 14.0.2 veröffentlicht.

Das Oracle JDK ist für Entwicklungszwecke verfügbar, Sie müssen jedoch ein Java SE-Abonnement für die kommerzielle Nutzung erwerben.

JEP Große Änderungen werden in JEP organisiert. https://openjdk.java.net/projects/jdk/14/

Diesmal wurden 16 JEPs importiert. Viele haben einen großen Einfluss. 305: Pattern Matching for instanceof (Preview) 343: Packaging Tool (Incubator) 345: NUMA-Aware Memory Allocation for G1 349: JFR Event Streaming 352: Non-Volatile Mapped Byte Buffers 358: Helpful NullPointerExceptions 359: Records (Preview) 361: Switch Expressions (Standard) 362: Deprecate the Solaris and SPARC Ports 363: Remove the Concurrent Mark Sweep (CMS) Garbage Collector 364: ZGC on macOS 365: ZGC on Windows 366: Deprecate the ParallelScavenge + SerialOld GC Combination 367: Remove the Pack200 Tools and API 368: Text Blocks (Second Preview) 370: Foreign-Memory Access API (Incubator)

Ich werde nach Feld zusammenfassen.

Sprachspezifikationen

Einige der Änderungen in Bezug auf die Sprachspezifikationen sind wie folgt. 359: Records (Preview) 305: Pattern Matching for instanceof (Preview) 368: Text Blocks (Second Preview) 361: Switch Expressions (Standard)

359: Records (Preview)

Der Datensatz wurde als Vorschaufunktion als Klasse für die Datenaufbewahrung hinzugefügt. Eine verbesserte Version, die das Feedback in Java 15 widerspiegelt, wird in der Vorschau angezeigt und in Java 16 formalisiert.

Als Datensatz definieren.

record Foo(int x, int y) {}

Andere Klassen können nicht vererbt werden.

record Name des Datensatzes(Status) {Definition}

Dies wäre eine Klasse wie diese:

class Foo extends Record {
  //Staat als privates Finale definiert
  private final int x;
  private final int y;
  //Es können keine zusätzlichen Instanzfelder definiert werden

  //Ein Konstruktor, der den Status auf das Feld setzt, wird definiert
  public Foo(int x, int y) {
    this.x = x;
    this.y = y;
  }

  //Eine Methode mit demselben Namen wie der Status wird definiert
  public int x() {
    return x;
  }
  public int y() {
    return y;
  }

  //Ein Hashcode, der den Status widerspiegelt, wird definiert
  public int hashCode() { ... }
  //Gleich zum Vergleichen von Zuständen werden definiert
  public boolean equals() { ... }
  //Ein toString, der den Status anzeigt, ist definiert
  public String toString() { ... }
}

Die Methode zum Abrufen ist definiert, die Methode zum Festlegen des Werts ist jedoch nicht definiert. Mit anderen Worten, es ist ein unveränderliches Objekt. Da es nicht get / set ist, ist es auch nicht mit Java Bean kompatibel. Die Methoden hashCode () und equals () sind tatsächlich invokeDynamic und der Implementierungscode wird zur Laufzeit generiert.

Sie können einen Konstruktor für die Statusprüfung und Normalisierung wie folgt definieren:

record Range(int lo, int hi) {
  public Range {
    if (lo > hi) throw IllegalArgumentException();
    //Felder, die nicht festgelegt wurden, werden später festgelegt
  }
}

Sie können keinen Datensatz in einer nicht statischen inneren Klasse definieren. Das Kompilieren von Code wie dem folgenden führt zu dem Fehler "Datensatzdeklarationen in inneren Klassen nicht zulässig".

public class NestedRecord {
  class Foo {
      record Bar(int x){}
  }
}

Sie können Code wie folgt kompilieren:

public class NestedRecord {
  static class Foo {
      record Bar(int x){}
  }
}

API-Erweiterung

record ist eine Klasse, die java.lang.Record erbt.

Wenn Sie versuchen, Code, der von Record erbt, wie folgt zu schreiben, wird der Fehler "Datensätze können java.lang.Record nicht direkt erweitern" angezeigt.

class Foo extends Record {
}

Datensatzbezogene Methoden wurden der Klasse "Klasse" hinzugefügt. Mit der Methode "isRecord" können Sie feststellen, ob der Typ ein Datensatz ist. Sie können die durch Datensatz definierten Komponenten auch mit "getRecordComponents" abrufen. Es scheint jedoch, dass der Wert über Field abgerufen werden kann, da er nicht über RecordComponent abgerufen werden kann.

jshell> Foo.class.isRecord()
$9 ==> true

jshell> Foo.class.getRecordComponents()
$10 ==> RecordComponent[2] { int x, int y }

jshell> String.class.isRecord()
$11 ==> false

jshell> String.class.getRecordComponents()
$12 ==> null

Einschränkung von "Datensatz" als Typname

Es ist beschränkt, einem Typ (z. B. einem Datensatztyp für Klassenschnittstellen) den Namen "Datensatz" zu geben. Ein Fehler tritt auf, wenn "--enable-Preview" hinzugefügt wird.

$ jshell --enable-preview
|Willkommen bei JShell--Version 14-ea
|Geben Sie für eine Übersicht Folgendes ein: /help intro

jshell> class record{}
|Error:
|Hier'record'Ist nicht erlaubt
|Ab Release 13'record'Ist ein eingeschränkter Typname und kann nicht zum Deklarieren eines Typs verwendet werden
|  class record{}
|        ^

jshell> String record=""
record ==> ""

jshell> record Rec(int record){}

jshell> Rec record=new Rec(3)
record ==> Rec[record=3]

Übrigens ist dieses "ab Release 13" falsch, aber ab 14. http://mail.openjdk.java.net/pipermail/amber-dev/2020-February/005623.html

Im Gegensatz zu enum ist es kein Schlüsselwort, sodass Sie den Datensatz für Variablennamen, Felder und Komponentennamen des Datensatzes verwenden können. Wenn Sie "--enable-Preview" nicht hinzufügen, wird eine Warnung angezeigt.

$ jshell
|Willkommen bei JShell--Version 14-ea
|Geben Sie für eine Übersicht Folgendes ein: /help intro

jshell> class record{}
|Warnung:
|  'record'Kann in einer zukünftigen Version ein eingeschränkter Typname sein und darf nicht in Typdeklarationen oder als Elementtyp eines Arrays verwendet werden
|  class record{}
|        ^
|Erstellt das Folgende:Klassenrekord

Zukünftige Verbesserung

Anfangs war es das gleiche JEP wie bei Sealed Types, aber es wurde getrennt. Diese Funktion kann die Klassenvererbung auf eine begrenzte Anzahl von Klassen beschränken. Es scheint in Java 15 in der Vorschau zu sein. JEP 360: Sealed Types (Preview)

Verbesserungen in Vorschau 2 werden hier vorgeschlagen. https://mail.openjdk.java.net/pipermail/amber-spec-experts/2020-January/001913.html

--java.util.Record ist eine Klasse, aber die Inline-Klasse von Valhalla kann nur die Schnittstelle erben. Sollte dies also eine Schnittstelle sein?

Referenz Feedback von Stephen Colebourne https://mail.openjdk.java.net/pipermail/amber-dev/2019-November/005271.html

305: Pattern Matching for instanceof (Preview)

Es ist Mustervergleich. Zunächst wird eine Musterübereinstimmung mit der Instanz von in 14 als Vorschau aufgenommen. http://openjdk.java.net/jeps/305

Sie können die Werte mit der "Wertinstanz des Musters" abgleichen. Das Muster ist eine konstante oder variable Definition. Wenn bei einer Variablendefinition die Typen übereinstimmen, wird sie wahr und dieser Variablen wird ein Wert zugewiesen.

if (x instanceof Integer i) {
    // can use i here
}

Es wäre schön, es auf dem Switch verwenden zu können, aber es wurde in einem anderen JEP definiert und auf Java 15 übertragen. JEP draft: Pattern matching for switch (Preview)

Es scheint auch, dass die Funktion zum Zerlegen von Datensätzen (Dekonstruktion) und deren Verschachtelung eingeführt wird und Java 15 als Vorschau 2 eingegeben wird. http://openjdk.java.net/jeps/8235186

Als vernünftiger Zeitplan

Wird es sein

17LTS hat jedoch die Aussicht, die Mustervergleichsfunktion als Standardfunktion aufzunehmen.

368: Text Blocks (Second Preview)

Sie können eine Zeichenfolge definieren, die Zeilenumbrüche enthält. Fügen Sie in "" "" "ein. In JDK13 gibt es einige Änderungen, z. B. Zeilenumbrüche in der Vorschau in JDK13. Es wird Standard in JDK15 sein.

// same as "You can write\ntwo line string.\n"
var str = """
  You can write
  two line string.
  """;

Dem Start "" "kann kein String folgen, und der Einzug basiert auf dem" "" "oder dem flachsten Teil des internen Strings.

var str = """
..You can write
..two line string.
  """;
var str = """
..  You can write
..  two line string.
  """;

Sie können auch Zeilenumbrüchen entkommen.

var str = """
  You can write \
  two line string, \
  but this is single.
  """;

Dies ist "Sie können eine zweizeilige Zeichenfolge schreiben, dies ist jedoch eine einzelne."

Das Leerzeichen am Ende der Zeile wird entfernt. Wenn Sie also am Ende der Zeile ein Leerzeichen benötigen, geben Sie "\ s" ein, um anzugeben, dass Sie ein Leerzeichen benötigen.

var str = """
  test\s
  test \s
  """;

Dies ist "test_ \ ntest__ \ n". (Selbst wenn Sie in Qiita mehrere Leerzeichen einfügen, ist dies ein Leerzeichen.)

Sie können keine Variablen in eine Zeichenfolge einbetten. Stattdessen wird die formatierte Methode als Instanzmethode bereitgestellt, und Sie können jetzt schreiben:

var str = """
Hallo,%Frau.
Das Wetter ist heute gut, nicht wahr?
  """.formatted("Kishida");

361: Switch Expressions (Standard)

Sie können jetzt die vorherige Anweisung "switch" als Ausdruck verwenden. Eingeführt als Vorschau in Java 12, geändert in Java 13 und offiziell eingeführt in Java 14. https://openjdk.java.net/jeps/361

Switch war eine Anweisung, aber da viele Switches sie verwendeten, um derselben Variablen Werte zuzuweisen oder in allen Fällen zurückzugeben, kann sie auch als Ausdruck verwendet werden, damit sie effizient geschrieben werden kann. Ich werde.

Mit anderen Worten, so.

int numLetters = switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY -> 7;
    case THURSDAY, SATURDAY -> 8;
    case WEDNESDAY -> 9;
};

Sie können auch einen Wert mit "Yield" zurückgeben.

int result = switch (s) {
    case "Foo":
        yield 1;
    case "Bar":
        yield 2;
    default:
        System.out.println("Neither Foo nor Bar, hmmm...");
        yield 3;
}

Die Grundform besteht darin, einen Wert mit "Ausbeute" zurückzugeben.

case LABEL: yield expression;

Es scheint, dass Sie wie Lambda als diese Syntax Zucker schreiben können.

case LABEL -> expression;

Außerdem können Sie mehrere Werte für "case" angeben.

switch (day) {
    case MONDAY, FRIDAY, SUNDAY: 
        numLetters = 6;
        break;
    ...
};

Diese "case" -Erweiterungen gelten auch für vorhandene "switch" -Anweisungen.

JVM Als Verhaltensänderung von JVM gibt es eine detaillierte Meldung mit "NullPointerException". 358: Helpful NullPointerExceptions

358: Helpful NullPointerExceptions

Ich denke, Java-Programmierer lieben "NullPointerException". Ich befürchtete jedoch, dass die Nachricht nicht vollständig sein würde. In Java 14 können Sie jetzt detaillierte Nachrichten zu "NullPointerException" anzeigen.

Zum Beispiel, wenn Sie den folgenden Code haben:

public class Sample {
  static String s;
  public static void main(String... args) {
    s.length();
  }
}

Wenn Sie es normal in Java 14 ausführen, werden keine speziellen Meldungen wie in früheren Versionen angezeigt.

$ java Sample.java
Exception in thread "main" java.lang.NullPointerException
        at Sample.main(mysample.java:4)

Wenn Sie es mit der Option -XX: + ShowCodeDetailsInExceptionMessages ausführen, sehen Sie, was der Fehler aufgetreten ist, als Sie what for what aufgerufen haben.

$ java -XX:+ShowCodeDetailsInExceptionMessages Sample.java
Exception in thread "main" java.lang.NullPointerException:
    Cannot invoke "String.length()" because "Sample.s" is null
        at Sample.main(mysample.java:4)

Diese Nachrichtenkonstruktion wird ausgeführt, wenn die Nachricht abgerufen wird, sodass sie anscheinend nur geringe Auswirkungen auf die Leistung hat.

Fügen Sie für JShell -R-XX: + ShowCodeDetailsInExceptionMessages hinzu.

$ jshell -R-XX:+ShowCodeDetailsInExceptionMessages
|Willkommen bei JShell--Version 14-ea
|Geben Sie für eine Übersicht Folgendes ein: /help intro

jshell> String[] strs = {null}
strs ==> String[1] { null }

jshell> strs[0].toUpperCase()
|Ausnahme Java.lang.NullPointerException: Cannot invoke "String.toUpperCase()" because "REPL.$JShell$11.strs[0]" is null
|        at (#2:1)

API Die API-Änderungen sind die folgenden drei JEPs. 349: JFR Event Streaming 370: Foreign-Memory Access API (Incubator) 352: Non-Volatile Mapped Byte Buffers Darüber hinaus wurde in CompactNumberFormat eine Unterstützung für mehrere Formulare und in StrictMath eine praktische Methode hinzugefügt. Darüber hinaus wurde die API für das Verpackungstool, die später im Abschnitt Tools erläutert wird, als Inkubator hinzugefügt, und die API für das Pac200 wurde entfernt.

Die API-Unterschiede sind hier zusammengefasst. DRAFT: API Differences Between Java SE 13 (build 33) & Java SE 14 (build 36)

349: JFR Event Streaming

Flight Recorder ist ein Tool zur Erfassung von Metriken, das für die Analyse im Fehlerfall nützlich ist, jedoch die Analyse von Speicherauszugsdateien erfordert, was für Überwachungszwecke unpraktisch ist. JFR Event Streaming bietet benutzerfreundliche Funktionen für die Überwachung, z. B. die Ereignisregistrierung.

Das JEP-Beispiel zeigt ein Beispiel für die Ereignisregistrierung, aber ich habe die Ausgabe des GC-Protokolls hinzugefügt.

import java.io.IOException;
import java.time.Duration;
import jdk.jfr.consumer.RecordingStream;
public class JFRStreamTest {
     
    public static void main(String[] args) throws IOException  {
         
        try (var rs = new RecordingStream()) {
            rs.enable("jdk.CPULoad").withPeriod(Duration.ofSeconds(1));
            rs.enable("jdk.JavaMonitorEnter").withThreshold(Duration.ofMillis(10));
            rs.onEvent("jdk.CPULoad", event -> {
                System.out.println(event.getFloat("machineTotal"));
            });
            rs.onEvent("jdk.JavaMonitorEnter", event -> {
                System.out.println(event.getClass("monitorClass"));
            });
            rs.onEvent("jdk.GarbageCollection", System.out::println);
            rs.start();
        }
    }
}

Wenn Sie es mit -XX: StartFilghtRecording ausführen, wird Flight Recorder gestartet und die Metriken werden regelmäßig angezeigt.

$ java -XX:StartFlightRecording JFRStreamTest.java
Started recording 1. No limit specified, using maxsize=250MB as default.

Use jcmd 79660 JFR.dump name=1 filename=FILEPATH to copy recording data to file.
[1.715s][warning][os] Unable to resolve PDH index: (230)
[1.716s][warning][os] Please check the registry if this performance object/counter is disabled
{
  classLoader = null  name = "jdk/jfr/internal/PlatformRecorder"
  package = {
    name = "jdk/jfr/internal"
    module = {
      name = "jdk.jfr"
      version = "14-ea"
      location = "jrt:/jdk.jfr"
      classLoader = null    }
    exported = true
  }
  modifiers = 49
}

jdk.GarbageCollection {
  startTime = 13:51:48.973
  duration = 12.5 ms
  gcId = 1
  name = "G1New"
  cause = "G1 Evacuation Pause"
  sumOfPauses = 12.5 ms
  longestPause = 12.5 ms
}

Sie können es unter JDK Mission Control (JMC) sehen. Wenn Sie JFR weiter ausführen, können Sie sehen, dass das Ereignis im Ereignisbrowser aufgezeichnet wird. image.png

370: Foreign-Memory Access API (Incubator)

Der Zugriff auf Speicher außerhalb des Heapspeichers hat Vor- und Nachteile, z. B. die Verwendung von ByteBuffer, Unsafe und JNI. Wenn Sie den direkten Puffer mit ByteBuffer verwenden, ist er auf 2 GB begrenzt, die von int verarbeitet werden können, und die Speicherfreigabe hängt von der GC ab. Im Fall von Unsafe ist die Leistung gut, aber wie der Name schon sagt, ist sie nicht sicher und die JVM stürzt ab, wenn Sie auf den freigegebenen Speicher zugreifen. Mit JNI müssen Sie C-Code schreiben und die Leistung ist nicht gut.

Aus diesem Grund wurde eine API eingeführt, die den Speicher außerhalb des Heapspeichers direkt verarbeitet. Der Code sieht folgendermaßen aus:

VarHandle intHandle = MemoryHandles.varHandle(int.class);

try (MemorySegment segment = MemorySegment.allocateNative(100)) {
   MemoryAddress base = segment.baseAddress();
   for (int i = 0 ; i < 25 ; i++) {
        intHandle.set(base.offset(i * 4), i);
   }
}

352: Non-Volatile Mapped Byte Buffers

Unterstützt ByteBuffer für nichtflüchtigen Speicher. Ein Modul namens "jdk.nio.mapmode" wurde eingeführt, und die "ExtendedMapMode" -Klasse wurde im Paket mit demselben Namen wie ein neuer MapMode vorbereitet.

Wird hinzugefügt werden.

var fc = FileChannel.open(path);
fc.map(ExtendedMapMode.READ_WRITE_SYNC, 0, 1024);

Es fühlt sich an wie. Eine UnsupportedOperationException wird ausgelöst, wenn das Gerät kein nichtflüchtiger Speicher ist.

Es scheint auch, dass BufferPoolMXBean in der Lage sein wird, persistente MappedByteBuffer-Statistiken mit dem Namen "mapped -" nichtflüchtiger Speicher "abzurufen.

@PreviewFeature

Eingeführte APIs für Vorschaufunktionen wie String.formatted waren in 13 veraltet. In 14 wurde "@ PreviewFeature" als interne Anmerkung eingeführt, und es wurde klargestellt, dass es sich um eine API für die Vorschaufunktion handelt. In 13 könnte es ohne "--enable-Preview" verwendet werden, in 14 jedoch mit diesen APIs, wenn "--enable-Preview" nicht angegeben ist

formatted(java.lang.Object...)Ist eine API, die Teil der Vorschaufunktion ist

Ich bekomme so einen Fehler.

Geben Sie mit @Serial explizit serialisierungsbezogene Methodenfelder an

Ich definiere verwandte Felder und Methoden für Klassen, die serialisiert werden können, aber obwohl sie eine feste Signatur haben, werden sie beim Kompilieren nicht überprüft und ich konnte nicht bestätigen, dass sie korrekt definiert sind.

private static final long serialVersionUID

https://download.java.net/java/GA/jdk14/docs/api/java.base/java/io/Serial.html https://bugs.openjdk.java.net/browse/JDK-8217698

Unterstützt mehrere Formen des kompakten Zahlenformats

Eine der Änderungen, die nicht JEP ist. Im Fall von Deutsch oder Italienisch gibt es Variationen wie Million oder Millionen in 1 Million und 2 Millionen, und es scheint, dass sie dem entsprachen.

jshell> import java.text.*

jshell> var cnf = CompactNumberFormat.getCompactNumberInstance(Locale.GERMAN, NumberFormat.Style.LONG)
cnf ==> java.text.CompactNumberFormat@5088aaba

jshell> cnf.format(1_000_000)
$3 ==> "1 Million"

jshell> cnf.format(2_000_000)
$4 ==> "2 Millionen"

Es gibt auch einen Konstruktor, mit dem Sie Ihre eigenen Regeln gemäß den Pluralregeln für die Unicode-Sprache festlegen können (https://unicode.org/reports/tr35/tr35-numbers.html#Language_Plural_Rules).

Hinzufügen einer praktischen Methode zu StrictMath

StrictMath wurde eine praktische Methode hinzugefügt. Wollten Sie die Verwendung von Methodenreferenzen vereinfachen?

Inkrementieren, Dekrementieren, Vorzeichenumkehr, aber bei Überlauf Ich bekomme eine Fehlermeldung.

jshell> StrictMath.incrementExact(3)
$5 ==> 4

jshell> StrictMath.incrementExact(Integer.MAX_VALUE)
|Ausnahme Java.lang.ArithmeticException: integer overflow
|        at Math.incrementExact (Math.java:968)
|        at StrictMath.incrementExact (StrictMath.java:849)
|        at (#4:1)

jshell> StrictMath.negateExact(Integer.MAX_VALUE)
$6 ==> -2147483647

jshell> StrictMath.negateExact(Integer.MIN_VALUE)
|Ausnahme Java.lang.ArithmeticException: integer overflow
|        at Math.negateExact (Math.java:1044)
|        at StrictMath.negateExact (StrictMath.java:909)
|        at (#7:1)

Bei normalen Bedienern tritt ein Überlauf auf.

jshell> Integer.MAX_VALUE+1
$8 ==> -2147483648

jshell> Integer.MIN_VALUE
$9 ==> -2147483648

jshell> -Integer.MIN_VALUE
$10 ==> -2147483648

Werkzeug

Als Werkzeugwechsel ist die Hinzufügung von jpackage groß. 343: Packaging Tool (Incubator) 367: Remove the Pack200 Tools and API

343: Packaging Tool (Incubator)

Ein Tool zum Erstellen von Installationsprogrammen für Java-Anwendungen wurde hinzugefügt. Verwandte APIs wurden ebenfalls hinzugefügt, es handelt sich jedoch um ein Inkubator-Modul. Windows erfordert light.exe und candle.exe, daher müssen Sie sie von https://wixtoolset.org herunterladen und Ihrem PATH hinzufügen.

Versuchen wir, ein Installationsprogramm für die folgende Anwendung zu erstellen.

import javax.swing.*;
public class App {
    public static void main(String[] args) {
        var f = new JFrame("My App");
        var t = new JTextArea();
        f.add(t);
        var b = new JButton("Hello");
        b.addActionListener(al -> t.append("Hello!\n"));
        f.add("North", b);
        f.setSize(500, 400);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }
}

Die Anwendung muss eine Jar-Datei sein.

$ javac App.java
$ mkdir target
$ jar cf target/app.jar App.class
$ jpackage --name myapp --input target --main-jar app.jar --main-class App

Dadurch wird ein 45-MB-Installationsprogramm mit dem Namen myapp.exe für Windows erstellt. Bei modularer JAR wird die Java-Laufzeit nur der erforderlichen Module automatisch installiert. Da ich jedoch eine Jar-Datei erstellt habe, die hier keine Module unterstützt, ist die Erstellung einer minimalen Java-Laufzeit mit jlink gering. Sie können ein Installationsprogramm erstellen.

$ jdeps --list-deps App.class
java.base
java.desktop
$ jlink --add-modules java.base,java.desktop --output jre
$ jpackage --name myapp --input target --main-jar app.jar --main-class App --runtime-image jre

Dies reduzierte die Größe des Installationsprogramms auf 27 MB. Die Anwendungsgröße nach der Installation wird ebenfalls von 124 MB auf 74 MB reduziert. Für Windows ist es besser, "--win-menu" hinzuzufügen, um die App zum Windows-Menü hinzuzufügen.

367: Remove the Pack200 Tools and API

Pack200 war ein Tool zum effizienten Komprimieren von Jar-Dateien. Es wird jedoch entfernt, da der Hauptanwendungsfall Applet nicht mehr verwendet wird und nicht mehr verwendet wird. Verwandte APIs unter "java.util.jar" werden ebenfalls gelöscht.

GC Es gab fünf JEPs mit Änderungen im Zusammenhang mit GC. 363: Remove the Concurrent Mark Sweep (CMS) Garbage Collector 364: ZGC on macOS 365: ZGC on Windows 366: Deprecate the ParallelScavenge + SerialOld GC Combination 345: NUMA-Aware Memory Allocation for G1

363: Remove the Concurrent Mark Sweep (CMS) Garbage Collector Concurrent Mark & Sweep GC wird aus dem Quellcode entfernt. Es war in JEP 291 von Java 9 veraltet, aber niemand schien die Wartung zu übernehmen, daher werde ich es löschen. Auf diese Weise wird erwartet, dass die Wartungskosten für GC gesenkt und die Entwicklung anderer GCs beschleunigt werden.

364: ZGC on macOS/365:ZGConWindows

ZGC, das bisher nur Linux unterstützte, unterstützt jetzt MacOS und Windows. Ursprünglich wurde davon ausgegangen, dass ZGC nur auf Linux-Produktionsservern und MacOS und Windows nur für Entwicklungszwecke verwendet werden. Da jedoch Anforderungen wie die Ausführung der IDE unter ZGC auftraten, werden auch MacOS und Windows unterstützt. Es scheint, dass es beschlossen wurde, es zu tun. Windows ist kompatibel mit Windows 10 Version 1803 oder höher. ZGC verwendet einen Mechanismus für den Zugriff auf physischen Speicher mit mehreren Adressen unter Verwendung virtueller Adressen. Es scheint jedoch, dass ZGC auch unter Windows betrieben werden kann, da der Speicher für Auslagerungsdateien ab 1803 unter Windows unterstützt wird.

366: Deprecate the ParallelScavenge + SerialOld GC Combination

Die Kombination aus Prallel für den GC im Young-Bereich und Serial für den GC im Old-Bereich, die selten verwendet wird, aber schwer zu warten ist, wurde abgelehnt.

345: NUMA-Aware Memory Allocation for G1 In letzter Zeit ist die NUMA-Architektur (Non-Uniform Memory Access) weit verbreitet, bei der der Speicherzugriff von jedem Kern nicht gleich ist. Parallel GC unterstützte NUMA, G1 jedoch nicht. Mit diesem JEP unterstützt G1 auch NUMA. Das unterstützte Betriebssystem ist jedoch nur Linux.

JDK Änderungen, die sich auf das JDK selbst beziehen, beziehen sich auf das Freigabeformular und die Erstellungsrichtlinie. Die Unterstützung für Solaris und SPARC ist in Java 14 jetzt veraltet. 362: Deprecate the Solaris and SPARC Ports

362: Deprecate the Solaris and SPARC Ports Die Unterstützung für Solaris / SPARC, Solaris / x64 und Linux / SPARC wird entfernt. Wenn Sie wie bei der CMS-Entfernung nachweisen können, dass eine große Nachfrage besteht, wird diese zurückgezogen. Hier geht es auch um die Entwicklung von OpenJDK als Open Source, und es besteht die Möglichkeit, dass die fortgesetzte Unterstützung für kommerzielle Distributionen wie Oracle JDK fortgesetzt wird. Es scheint, dass die Java-Lizenzgebühr kein Problem darstellt, wenn Sie Solaris / SPARC einführen.

Recommended Posts

Zusammenfassung der neuen Funktionen von Java 12
Zusammenfassung der neuen Funktionen von Java 13
Zusammenfassung der neuen Funktionen von Java 10
Zusammenfassung der neuen Funktionen von Java 14
Zusammenfassung des Java-Wissens
Java Generics Zusammenfassung
Java-bezogene Zusammenfassung
Java1.8 neue Funktionen
[Zusammenfassung] Zum Beispiel die Vorbereitung der Java-Umgebung
effektive Java 3. Zusammenfassung
Java statisch [Persönliche Zusammenfassung]
Java 8 Lambda-Ausdruck Feature
Thread sichere Zusammenfassung ~ Java ~
Persönliche Zusammenfassung über Java
Was ist neu in Java 8?
JSF2.3 neue Funktionsübersicht
Zusammenfassung der regulären Ausdrücke von Java
Was ist neu in Java 9,10,11
Zusammenfassung der Java-Unterstützung 2018
Zusammenfassung des Java-Entwurfsmusters
Java-Zusammenfassung für reservierte Wörter
Grobe Zusammenfassung des Java8-Streams
Zusammenfassung der Revisionen (neue Yuan-Probleme) nach Java-Version
Was ist Java Assertion? Zusammenfassung.
[Java] Neue Thread-Generierungsmethode (2)
[Java11] Stream-Zusammenfassung - Vorteile von Stream -
Progate Java (Anfänger) Review & Zusammenfassung
Neue Funktionen von Java7 bis Java8
[Java] Zusammenfassung der regulären Ausdrücke
[Java] Zusammenfassung der Operatoren (Operator)
Java8-Stream, Zusammenfassung des Lambda-Ausdrucks
Objektorientierte Zusammenfassung von Anfängern (Java)
Zusammenfassung der Grundlagen der Java-Sprache
Java-Tipps - Zusammenfassung der Federausführung
Zusammenfassung der Java Math Klasse
PrimeFaces 6.0.x Zusammenfassung der neuen Funktionen
[Java11] Stream Usage Summary -Basics-
[Java] Zusammenfassung der Steuerungssyntax
Zusammenfassung der Java-Fehlerverarbeitung
[Java] Zusammenfassung der Entwurfsmuster
[Java] Neue Thread-Generierungsmethode (1)
[Java] Zusammenfassung der mathematischen Operationen
Neue Syntax für Java 12 Switch-Anweisungen
Berücksichtigung des Java Persistence Framework 2017 (Zusammenfassung) -1
[Für Anfänger] Zusammenfassung des Java-Konstruktors
Java-Veröffentlichungsdatum und EOL-Zusammenfassung
Java 9 neue Funktionen und Beispielcode
Zusammenfassung
AtCoder 400 Punkte Algorithmus Zusammenfassung (Java Edition)
Java
Java "Pass by Reference" Problemzusammenfassung
Java
Zusammenfassung der objektorientierten Programmierung mit Java
[Java Silver] Zusammenfassung der Zugriffsmodifikatorpunkte
Zusammenfassung der internen Rookie-Lernsitzung [Java]
So erstellen Sie eine Java-Kalenderzusammenfassung
Memorandum des neuen Absolventen SES [Java-Grundlagen]
[java] Zusammenfassung des Umgangs mit char
Zusammenfassung anderer Änderungen als JEP von Java10
Ich habe das neue Yuan-Problem in Java ausprobiert