Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Java 25 ist eine long-term Support (LTS)-Version, die es zu einem natürlichen Ziel für Teams macht, die heute auf Java 8, 11, 17 oder 21 ausgeführt werden. Jede LTS-Version erhält jahrelang Updates und Sicherheitskorrekturen, sodass Ihre Anwendungen durch einen Wechsel zu Java 25 weiterhin unterstützt und sicher bleiben und die neuesten Leistungs- und Sprachverbesserungen nutzen können.
Die Frage ist nicht , wenn Sie zu einer neueren LTS-Version wechseln sollten, aber wann. Je länger Sie warten, desto mehr Änderungen werden zwischen Ihrer aktuellen Version und der nächsten unterstützten Version gesammelt. Es gibt klare Vorteile für den Umstieg auf Java 25, und die Planung des Umzugs früher als später reduziert das Risiko.
Seit Java 8 hat jede Version Features und Verbesserungen hinzugefügt. Es gibt spürbare Ergänzungen und Änderungen an der API sowie Verbesserungen der Startzeit, des Durchsatzes, der Speichernutzung, der Skalierbarkeit und der Entwicklerproduktivität. In diesem Artikel werden die wirkungsvollsten Änderungen hervorgehoben, wobei der Schwerpunkt auf den Java Versionen liegt, die seit der Java 11 LTS-Version bereitgestellt wurden: Java 17, Java 21 und Java 25.
Übergang zu Java 25
Sie können schrittweise zu Java 25 wechseln. Code, der mit einem älteren JDK entwickelt und erstellt wurde, kann in der Regel auf Java 25 ohne erneute Kompilierung ausgeführt werden. Wie bei allen wichtigen Upgrades, achten Sie auf entfernte APIs, veraltete Pakete, die Verwendung interner APIs und Änderungen am Standardverhalten, insbesondere bei der Garbage Collection.
Wenn Sie von Java 8 oder 11 kommen, beginnen Sie mit dem Übergang von Java 8 zu Java 11 Leitfaden, um die größten Änderungen zu beheben, und fahren Sie dann mit Java 17, 21 und 25 fort. Wenn Sie bereits auf Java 17 oder 21 arbeiten, ist der Wechsel zu Java 25 in der Regel kleiner, da sich das Modulsystem und die meisten Plattformänderungen bereits hinter Ihnen befinden.
Tip
GitHub Copilot für die Anwendungsmodernisierung kann Ihnen helfen, Ihre Anwendung zu bewerten, die Modernisierung zu planen und automatisch Codeänderungen vorzunehmen. Es unterstützt Upgrades zwischen Java Versionen 8, 11, 17, 21 und 25, Builds und Tests Ihres Projekts nach jeder Änderung und hilft bei der Behebung der Verhaltensänderungen, die weiter unten in diesem Artikel beschrieben werden.
Tip
JVM-Flags, die für ein älteres JDK optimiert wurden, können auf Java 25 veraltet, entfernt oder suboptimal werden. Anstatt veraltete Einstellungen zu übernehmen, können Sie den Azure Command Launcher for Java (jaz) JVM-Flags automatisch anwenden lassen, die auf die JDK-Version sowie auf die Ressourcen Ihres Containers oder Ihrer virtuellen Maschine zugeschnitten sind. Ersetzen Sie den java-Befehl durch jaz in Ihrem Startskript oder Dockerfile, um davon zu profitieren.
Allgemeine Änderungen seit Java 11
In diesem Abschnitt werden nicht alle änderungen aufgelistet, die seit Java 8 vorgenommen wurden. Es hebt die Änderungen hervor, die die größten Auswirkungen auf Leistung, Skalierbarkeit, Diagnose, Produktivität und Sicherheit haben. Die meisten dieser Features sind in den Java 17, 21 und 25 Versionen angekommen und sind jetzt Teil der LTS-Basislinie, die Sie mit Java 25 erhalten. Jedes Feature notiert die Java Version, in die es integriert wurde.
Skalierbarkeit mit virtuellen Threads
Virtuelle Threads [1] sind einfache Threads, die vom JVM anstelle des Betriebssystems verwaltet werden, wodurch die Kosten für das Schreiben und Ausführen von gleichzeitigen Anwendungen mit hohem Durchsatz erheblich reduziert werden. Mit virtuellen Threads können Sie Code in einem einfachen Thread-pro-Anforderungsstil schreiben und dennoch auf eine große Anzahl gleichzeitiger Vorgänge skalieren, die ideal für E/O-gebundene Mikroservices und Anforderungsantwortworkloads geeignet sind.
Virtuelle Threads wurden mit Java 21 finalisiert. Java 24 hat eine wichtige Einschränkung beseitigt, indem es virtuellen Threads ermöglicht, sich zu synchronisieren, ohne ihre Carrier-Threads anzuheften [2], was die Skalierbarkeit von Code verbessert, der synchronized-Blöcke verwendet.
Strukturierte Nebenläufigkeit und bereichsgebundene Werte
Bereichswerte [3] bieten eine sichere, effiziente Möglichkeit, unveränderliche Daten innerhalb und über Threads hinweg zu teilen, einschließlich virtueller Threads. Sie stellen eine moderne Alternative zu thread-lokalen Variablen dar, die sich gut für das „Thread-pro-Task“-Modell eignet.
Strukturierte Parallelität [4] behandelt Gruppen verwandter gleichzeitiger Aufgaben als eine einzelne Arbeitseinheit, die die Fehlerbehandlung und -abbruch vereinfacht. Erstmals in Java 21 als Vorschau vorgestellt, entwickelt es sich weiter und harmoniert natürlich mit virtuellen Threads.
Sprachproduktivität
Eine Reihe von Sprachverbesserungen, die über Java 14 bis Java 25 bereitgestellt werden, machen Code präziser, sicherer und einfacher zu lesen:
-
Switch-Ausdrücke [5] (Java 14) ermöglichen
switchdie Rückgabe eines Werts und verwenden eine übersichtlichere Pfeilsyntax. -
Musterabgleich für
instanceof[6] (Java 16) entfernt die Notwendigkeit expliziter Umwandlungen nach einer Typüberprüfung. - Records [7] (Java 16) modellieren unveränderliche Daten als transparente Träger für eine feste Menge von Werten und reduzieren den Boilerplate-Code.
- Mit versiegelten Klassen [8] (Java 17) können Sie steuern, welche Klassen einen Typ erweitern oder implementieren können.
- Textblöcke [9] (Java 15) vereinfachen mehrzeilige Zeichenfolgenliterale.
-
Musterabgleich für
switch[10] (Java 21) und Aufzeichnungsmuster [11] (Java 21) ermöglichen es Ihnen, komplexe bedingte Logik und Datenstrukturzerlegung klar und sicher auszudrücken. - Sequenzierte Auflistungen [12] (Java 21) fügen eine einheitliche API für Sammlungen mit einer definierten Begegnungsreihenfolge hinzu, einschließlich des Zugriffs auf die ersten und letzten Elemente.
- Nicht benannte Variablen und Muster [13] (Java 22) ermöglichen es Ihnen, nicht verwendete Variablen und Musterkomponenten explizit zu markieren.
- Mit Modulimportdeklarationen [14] (Java 25) können Sie die exportierten Pakete eines gesamten Moduls mit einer einzigen Deklaration importieren.
- Kompakte Quelldateien und Instanzen der main-Methoden [15] (Java 25) reduzieren den Aufwand bei der Erstellung kleiner Programme, wodurch Java leichter zu erlernen ist und sich schneller Prototypen erstellen lassen.
-
Flexible Konstruktorrümpfe [16] (Java 25) ermöglichen es, vor dem Aufrufen von
super(...)oderthis(...)Anweisungen auszuführen, was die Validierung und Initialisierung verbessert.
Leistung und Start
Mehrere Laufzeitänderungen verbessern den Durchsatz, den Speicherbedarf und die Startzeit:
- Kompakte Objektheader [17] (Java 25) verringern die Größe von Objektheadern auf 64-Bit-Plattformen. Diese Reduzierung verringert die Heap-Auslastung und kann die Leistung für zuordnungsintensive Workloads verbessern.
- Klassendatenfreigabe (CDS) verringert die Startzeit durch Speicherzuordnung archivierter Klassen zur Laufzeit. Standardmäßige CDS-Archive [18] (Java 12) und dynamische CDS-Archive [19] (Java 13) erleichtern die Einführung dieses Features ohne manuelle Trainingsläufe.
- Vorzeitiges Laden und Verknüpfen von Klassen [20] (Java 24) verkürzt zusammen mit der vorzeitigen Optimierung der Befehlszeilenhandhabung [21] (Java 25) und der vorzeitigen Methodenprofilierung [22] (Java 25) die Start- und Aufwärmzeit durch die Wiederverwendung von in einem Anwendungsarchiv gespeicherten Informationen. Diese Features sind Teil Project Leydens Bemühungen, Java schneller starten zu können.
Diese Verbesserungen sind besonders nützlich für cloudeigene und serverlose Workloads, bei denen der schnelle Start und ein kleiner Speicherbedarf direkt in eine bessere Skalierung und niedrigere Kosten übersetzt werden.
Müllabfuhr
Java 25 wird mit ausgereiften Garbage Collectors mit geringen Pausenzeiten ausgeliefert, die für ein breites Spektrum an Workloads geeignet sind:
- ZGC [23] (Java 15) und Shenandoah [24] (Java 15) sind produktionsbereite Collectors, die für geringe Pausenzeiten auf großen Heaps ausgelegt sind.
- G1GC bleibt der Standard-Collector und wird weiterhin verbessert, unter anderem durch Region-Pinning [25] (Java 22) für eine reibungslosere Interaktion mit nativem Code.
- Generational ZGC [26] (Java 21) verbessert die Effizienz, indem separate Generationen beibehalten werden. Ab Java 23 wird ZGC standardmäßig im Generierungsmodus [27] ausgeführt, und der Modus ohne Generation wurde in Java 24 entfernt.
- Generational Shenandoah [28] (Java 25) fügt dem Shenandoah-Sammler einen Generationenmodus hinzu, um den Durchsatz und die Resilienz unter Speicherdruck zu verbessern.
Der JVM legt GC-Standardwerte für den durchschnittlichen Anwendungsfall fest. Optimieren Sie diese Standardwerte und andere GC-Einstellungen, um den Durchsatz oder die Latenz entsprechend den Anforderungen Ihrer Anwendung zu optimieren.
Tip
Der Standardmäßige Garbage Collector und viele JVM-Standardwerte unterscheiden sich in Java Versionen, sodass einstellungen, die für Java 8 oder 11 abgestimmt sind, für Java 25 möglicherweise nicht mehr optimal sind. Das Azure-Befehlsstartfeld für Java (jaz) liest den Cgroup-Speicher und die CPU-Grenzwerte des Containers und wendet JVM-Flags an, die automatisch auf die JDK-Version und -Umgebung zugeschnitten sind.
Diagnose und Beobachtbarkeit
Die Diagnosefunktionen wurden über mehrere Releases hinweg sowohl in der Programmiersprache als auch in Java Flight Recorder (JFR) verbessert:
-
Hilfreiche NullPointerExceptions [29] (Java 14) beschreiben genau, welche Variable
nullwar, wodurch das Debuggen beschleunigt wird. - Mit JFR-Ereignisstreaming [30] (Java 14) können Tools Profilerstellungs- und Diagnosedaten kontinuierlich und nicht aus einer Dumpdatei nutzen.
- JFR CPU-time profiling [31] (Java 25) fügt experimentelle CPU-zeitbasierte Methodenprofilerstellung auf Linux hinzu.
- Kooperatives Sampling in JFR [32] (Java 25) verbessert die Stabilität des Stack-Samplings.
- Mit der JFR-Methoden-Zeitmessung und -Ablaufverfolgung [33] (Java 25) können Sie die Ausführungszeit bestimmter Methoden messen und sie nachverfolgen, ohne den Anwendungscode zu ändern.
Sicherheit und Kryptografie
Java 25 stärkt den Sicherheitsstatus der Plattform, einschließlich der Vorbereitung auf eine Post-Quantum-Welt:
- Edwards-Curve Algorithmus für digitale Signaturen (EdDSA) [34] (Java 15) fügt ein modernes, leistungsfähiges Signaturschema hinzu.
- Die Schlüsselkapselungsmechanismus-API [35] (Java 21) stellt eine Standard-API für KEM-Algorithmen bereit.
- Quantenbeständige Kryptografie fügt Standardimplementierungen des Modul-Gitter-basierten Schlüsselkapselungsmechanismus (ML-KEM) [36] (Java 24) und digitalen Signaturalgorithmus (ML-DSA) [37] (Java 24) hinzu.
- API für Schlüsselableitungsfunktionen [38] (Java 25) stellt eine Standard-API für Schlüsselableitungsfunktionen bereit.
Native Interoperabilität
Die Fremdfunktions- und Speicher-API [39] (Java 22) bietet eine sichere, effiziente und reine Java Möglichkeit, systemeigene Bibliotheken aufzurufen und auf nativen Speicher zuzugreifen. Es ist eine moderne Alternative zum Java Native Interface (JNI), die den Boilerplate-Code reduziert und die Sicherheit verbessert.
Werkzeuge und Bibliotheken
Mehrere Ergänzungen verbessern die tägliche Entwicklung und reduzieren den Bedarf an Drittanbietertools:
-
Das Pakettool (
jpackage) [40] (Java 16) erstellt systemeigene Installationsprogramme und Pakete für Java Anwendungen. - Simple Web Server [41] (Java 18) bietet einen minimalen HTTP-Server für statische Dateien für Prototypen und Tests.
- Verbesserte Pseudorandomzahlengeneratoren [42] (Java 17) fügen neue Schnittstellen und Implementierungen für die Zufallszahlengenerierung hinzu.
Einzuplanende Verhaltensänderungen
Einige Änderungen seit Java 11 ändern das Standardverhalten. Überprüfen Sie sie daher vor dem Upgrade:
-
JDK-Interna stark kapseln [43] (Java 17) blockiert standardmäßig den reflektiven Zugriff auf die meisten internen APIs. Code oder Bibliotheken, die in
sun.*oder andere interne Pakete gelangen, benötigen möglicherweise Updates. - UTF-8 als Standard [44] (Java 18) macht UTF-8 zum Standard-Zeichensatz für Standard-Java-APIs. Anwendungen, die auf einem plattformspezifischen Standardzeichen basieren, verhalten sich möglicherweise anders.
-
Finalisierung zur Entfernung als veraltet markieren [45] (Java 18) signalisiert, dass
finalize()letztlich entfernt wird. Zutry-with-resources oderjava.lang.ref.Cleanermigrieren. - Vorbereitung auf das Unterbinden des dynamischen Ladens von Agenten [46] (Java 21) warnt, wenn ein Agent in eine laufende JVM geladen wird. Einige Überwachungs- und Instrumentierungstools benötigen möglicherweise Konfigurationsänderungen.
Tip
GitHub Copilot App-Modernisierung kann Ihnen helfen, diese Verhaltensänderungen beim Upgrade automatisch zu bewerten und zu beheben.
Container und die Cloud
Das Containerbewusstsein des JVM, das für Docker und andere Containerlaufzeiten eingeführt wurde, wird weiter verbessert. Die JVM liest CPU- und Arbeitsspeichereinschränkungen, die von Containersteuerungsgruppen (cgroups) festgelegt werden, und passt die Größe des Heaps und anderer Ressourcen entsprechend an. In Kombination mit schnellerem Start, einem kleineren Speicherbedarf und virtuellen Threads eignet sich Java 25 gut für containerisierte und serverlose Bereitstellungen auf Azure.
Wenn Sie Java Workloads auf Azure Containern oder virtuellen Computern ausführen, kann das Azure Command Launcher für Java (jaz) cloudoptimierte, versionsgerechte JVM-Standardwerte für Sie anwenden.
Nächste Schritte
- Umstellung von Java 8 auf Java 11
- Gründe für den Umstieg auf Java 11 und darüber hinaus
- Azure-Befehlsstartprogramm für Java
References
[1] Oracle Corporation, "JEP 444: Virtual Threads". (Online). Verfügbar: https://openjdk.org/jeps/444.
[2] Oracle Corporation, "JEP 491: Synchronisieren virtueller Threads ohne Pinning". (Online). Verfügbar: https://openjdk.org/jeps/491.
[3] Oracle Corporation, "JEP 506: Bereichswerte". (Online). Verfügbar: https://openjdk.org/jeps/506.
[4] Oracle Corporation, „JEP 453: Strukturierte Nebenläufigkeit (Vorschau).“ (Online verfügbar). Verfügbar: https://openjdk.org/jeps/453.
[5] Oracle Corporation, "JEP 361: Switch Expressions". (Online). Verfügbar: https://openjdk.org/jeps/361.
[6] Oracle Corporation, „JEP 394: Musterabgleich für instanceof.“ (Online). Verfügbar: https://openjdk.org/jeps/394.
[7] Oracle Corporation, "JEP 395: Records". (Online). Verfügbar: https://openjdk.org/jeps/395.
[8] Oracle Corporation, „JEP 409: Versiegelte Klassen.“ (Online). Verfügbar: https://openjdk.org/jeps/409.
[9] Oracle Corporation, "JEP 378: Textblöcke". (Online). Verfügbar: https://openjdk.org/jeps/378.
[10] Oracle Corporation, „JEP 441: Musterabgleich für Wechsel.“ (Online). Verfügbar: https://openjdk.org/jeps/441.
[11] Oracle Corporation, "JEP 440: Record Patterns". (Online). Verfügbar: https://openjdk.org/jeps/440.
[12] Oracle Corporation, "JEP 431: Sequenced Collections". (Online). Verfügbar: https://openjdk.org/jeps/431.
[13] Oracle Corporation, "JEP 456: Unnamed Variables & Patterns". (Online). Verfügbar: https://openjdk.org/jeps/456.
[14] Oracle Corporation, „JEP 511: Import-Deklarationen für Module.“ (Online). Verfügbar: https://openjdk.org/jeps/511.
[15] Oracle Corporation, "JEP 512: Kompakte Quelldateien und Instanz-Hauptmethoden." (Online). Verfügbar: https://openjdk.org/jeps/512.
[16] Oracle Corporation, "JEP 513: Flexible Konstruktorkörper". (Online). Verfügbar: https://openjdk.org/jeps/513.
[17] Oracle Corporation, "JEP 519: Compact Object Headers". (Online). Verfügbar: https://openjdk.org/jeps/519.
[18] Oracle Corporation, "JEP 341: Default CDS Archives". (Online). Verfügbar: https://openjdk.org/jeps/341.
[19] Oracle Corporation, "JEP 350: Dynamic CDS Archives". (Online). Verfügbar: https://openjdk.org/jeps/350.
[20] Oracle Corporation, „JEP 483: Ahead-of-Time-Klassenladen & -verlinkung.“ (Online). Verfügbar: https://openjdk.org/jeps/483.
[21] Oracle Corporation, „JEP 514: Ahead-of-Time-Befehlszeilenergonomie.“ (Online). Verfügbar: https://openjdk.org/jeps/514.
[22] Oracle Corporation, „JEP 515: Ahead-of-Time-Methodenprofilierung.“ (Online). Verfügbar: https://openjdk.org/jeps/515.
[23] Oracle Corporation, „JEP 377: ZGC: Ein skalierbarer Garbage Collector mit geringer Latenz.“ (Online). Verfügbar: https://openjdk.org/jeps/377.
[24] Oracle Corporation, „JEP 379: Shenandoah: Ein Garbage Collector mit kurzer Pausenzeit.“ (Online). Verfügbar: https://openjdk.org/jeps/379.
[25] Oracle Corporation, „JEP 423: Region-Pinning für G1.“ (Online). Verfügbar: https://openjdk.org/jeps/423.
[26] Oracle Corporation, "JEP 439: Generational ZGC". (Online). Verfügbar: https://openjdk.org/jeps/439.
[27] Oracle Corporation, „JEP 474: ZGC: Generationsmodus als Standard.“ (Online). Verfügbar: https://openjdk.org/jeps/474.
[28] Oracle Corporation, "JEP 521: Generational Shenandoah." (Online). Verfügbar: https://openjdk.org/jeps/521.
[29] Oracle Corporation, „JEP 358: Hilfreiche NullPointerExceptions.“ (Online). Verfügbar: https://openjdk.org/jeps/358.
[30] Oracle Corporation, "JEP 349: JFR Event Streaming". (Online). Verfügbar: https://openjdk.org/jeps/349.
[31] Oracle Corporation, „JEP 509: JFR CPU-Zeit-Profiling (experimentell).“ (Online verfügbar). Verfügbar: https://openjdk.org/jeps/509.
[32] Oracle Corporation, „JEP 518: JFR-Kooperationsprobenentnahme.“ (Online). Verfügbar: https://openjdk.org/jeps/518.
[33] Oracle Corporation, „JEP 520: JFR-Methodentiming & -Nachverfolung.“ (Online). Verfügbar: https://openjdk.org/jeps/520.
[34] Oracle Corporation, "JEP 339: Edwards-Curve Digital Signature Algorithm (EdDSA)." (Online). Verfügbar: https://openjdk.org/jeps/339.
[35] Oracle Corporation, "JEP 452: Key Encapsulation Mechanism API". (Online). Verfügbar: https://openjdk.org/jeps/452.
[36] Oracle Corporation, „JEP 496: Quantenresistenter Mechanismus zur Schlüsselkapselung auf der Grundlage eines Modulrasters." (Online). Verfügbar: https://openjdk.org/jeps/496.
[37] Oracle Corporation, "JEP 497: Quantum-Resistant Module-Lattice-Based Digital Signature Algorithm". (Online). Verfügbar: https://openjdk.org/jeps/497.
[38] Oracle Corporation, "JEP 510: Key Derivation Function API". (Online). Verfügbar: https://openjdk.org/jeps/510.
[39] Oracle Corporation, „JEP 454: Fremdfunktions- & Speicher-API.“ (Online). Verfügbar: https://openjdk.org/jeps/454.
[40] Oracle Corporation, "JEP 392: Packaging Tool". (Online). Verfügbar: https://openjdk.org/jeps/392.
[41] Oracle Corporation, "JEP 408: Simple Web Server". (Online). Verfügbar: https://openjdk.org/jeps/408.
[42] Oracle Corporation, „JEP 356: Verbesserte Pseudozufallszahlengeneratoren.“ (Online). Verfügbar: https://openjdk.org/jeps/356.
[43] Oracle Corporation, "JEP 403: JDK-Interna strikt kapseln." (Online verfügbar). Verfügbar: https://openjdk.org/jeps/403.
[44] Oracle Corporation, "JEP 400: UTF-8 standardmäßig." (Online). Verfügbar: https://openjdk.org/jeps/400.
[45] Oracle Corporation, „JEP 421: Finalisierung zur Entfernung als veraltet markieren.“ (Online). Verfügbar: https://openjdk.org/jeps/421.
[46] Oracle Corporation, "JEP 451: Vorbereitung auf die Untersagung des dynamischen Ladens von Agenten." (Online). Verfügbar: https://openjdk.org/jeps/451.