Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Java 25 je dlouhodobá verze podpory (LTS), která představuje přirozený cíl pro týmy, které dnes běží na Java 8, 11, 17 nebo 21. Každá verze LTS dostává roky aktualizací a oprav zabezpečení, takže přechod na Java 25 udržuje vaše aplikace podporované, zabezpečené a schopné využívat nejnovější vylepšení výkonu a jazyka.
Otázka není, pokud byste měli přejít na novější verzi LTS, ale kdy. Čím déle čekáte, tím více změn se shromáždí mezi aktuální verzí a další podporovanou verzí. Existují jasné výhody přechodu na Java 25 a plánování přesunu dříve než později snižuje riziko.
Od Java 8 má každá verze přidané funkce a vylepšení. K dispozici jsou patrné doplňky a úpravy rozhraní API spolu s vylepšeními doby spouštění, propustnosti, využití paměti, škálovatelnosti a produktivity vývojářů. Tento článek popisuje nejvýraznější změny se zaměřením na Java verze dodané od verze Java 11 LTS: Java 17, Java 21 a Java 25.
Přechod na Java 25
Můžete přejít na Java 25 krokově. Kód vyvinutý a sestavený pomocí starší sady JDK se obvykle může spouštět na Java 25 bez rekompilace. Stejně jako u každé větší aktualizace sledujte odebraná rozhraní API, balíčky označené jako zastaralé, používání interních rozhraní API a změny výchozího chování, zejména v oblasti garbage collection.
Pokud pocházíte z Java 8 nebo 11, začněte přechodem od Java 8 na Java 11, abyste vyřešili největší sadu zásadních změn, a pak pokračujte dál na Java 17, 21 a 25. Pokud už používáte Java 17 nebo 21, přechod na Java 25 je obvykle menší, protože systém modulů a většina změn platformy už je za vámi.
Tip
Modernizace aplikací v GitHub Copilotu vám může pomoct posoudit vaši aplikaci, naplánovat upgrade a automaticky provést změny v kódu. Podporuje upgrady mezi Java verzemi 8, 11, 17, 21 a 25, sestaveními a testováním projektu po každé změně a pomáhá napravit změny chování popsané dále v tomto článku.
Tip
Parametry JVM, které byly vyladěny pro starší verzi JDK, mohou být v Javě 25 zastaralé, odstraněné nebo neoptimální. Místo přenášení zastaralých nastavení můžete nechat spouštěč příkazů Azure pro Java (jaz) použít příznaky JVM přizpůsobené verzi sady JDK a prostředky vašeho kontejneru nebo virtuálního počítače automaticky. Nahraďte příkaz java příkazem jaz ve spouštěcím skriptu nebo použijte Dockerfile, abyste toho mohli využít.
Změny vysoké úrovně od Java 11
Tato část nevypíše všechny změny provedené od Java 8. Zvýrazňuje změny, které mají největší dopad na výkon, škálovatelnost, diagnostiku, produktivitu a zabezpečení. Většina těchto funkcí byla zavedena ve verzích Java 17, 21 a 25 a nyní jsou součástí základu LTS, který získáte s Javou 25. Každá funkce zaznamenává Java verzi, ve které byla integrovaná.
Škálovatelnost s využitím virtuálních vláken
Virtuální vlákna [1] jsou jednoduchá vlákna spravovaná prostředím JVM místo operačního systému, které výrazně snižují náklady na zápis a spouštění souběžných aplikací s vysokou propustností. S virtuálními vlákny můžete psát kód ve stylu jednoduchého vlákna na požadavek a stále škálovat na velký počet souběžných operací, což je ideální pro mikroslužby vázané na vstupně-výstupní operace a úlohy odezvy požadavků.
Virtuální vlákna byla finalizována v Java 21. Java 24 odstranilo jedno klíčové omezení tím, že umožnilo virtuálním vláknům synchronizovat se, aniž by připnula svá nosná vlákna [2], což zlepšuje škálovatelnost kódu, který používá bloky synchronized.
Strukturované souběžnosti a vymezené hodnoty
Vymezené hodnoty [3] poskytují bezpečný a efektivní způsob sdílení neměnných dat v rámci vláken a napříč vlákny, včetně virtuálních vláken. Jedná se o moderní alternativu k lokálním proměnným vláken, které dobře fungují s modelem vláken na úlohu.
Strukturovaná souběžnost [4] zpracovává skupiny souvisejících souběžných úloh jako jednu jednotku práce, což zjednodušuje zpracování chyb a zrušení. Poprvé byl představen v Javě 21 jako preview, nadále se vyvíjí a přirozeně se doplňuje s virtuálními vlákny.
Produktivita jazyků
Řada vylepšení jazyka doručovaných napříč Java 14 až Java 25 usnadňuje čtení kódu:
-
Výrazy přepínače [5] (Java 14) umožňují
switchvrátit hodnotu a použít čistější syntaxi šipky. -
Porovnávání vzorů pro
instanceof[6] (Java 16) eliminuje potřebu explicitního přetypování po kontrole typu. - Záznamy [7] (Java 16) modelují neměnná data jako transparentní nosiče pro pevně danou sadu hodnot, čímž omezují nadbytečný kód.
- Zapečetěné třídy [8] (Java 17) umožňují řídit, které třídy mohou rozšířit nebo implementovat typ.
- Textové bloky [9] (Java 15) zjednodušují víceřádkové řetězcové literály.
-
Porovnávání vzorů pro
switch[10] (Java 21) a vzory záznamů [11] (Java 21) umožňují vyjádřit složitou podmíněnou logiku a destrukci dat jasně a bezpečně. - Sekvencované kolekce [12] (Java 21) přidávají jednotné rozhraní API pro kolekce s definovaným pořadím setkání, včetně přístupu k prvním a posledním prvkům.
- Nepojmenované proměnné a vzory [13] (Java 22) umožňují explicitně označit nepoužívané proměnné a komponenty vzorů.
- Deklarace importu modulů [14] (Java 25) umožňují importovat exportované balíčky celého modulu s jedinou deklarací.
- Komprimace zdrojových souborů a hlavních metod instance [15] (Java 25) zkracuje obřad potřebný pro malé programy, což usnadňuje Java učení a rychlejší prototypy.
-
Flexibilní těla konstruktoru [16] (Java 25) umožňují spustit příkazy před voláním
super(...)nebothis(...), což zlepšuje ověřování a inicializaci.
Výkon a spuštění
Několik změn za běhu zlepšuje propustnost, nároky na paměť a čas spuštění:
- Kompaktní záhlaví objektů [17] (Java 25) zmenšují velikost záhlaví objektů na 64bitových platformách. Toto snížení snižuje využití haldy a může zlepšit výkon úloh náročných na přidělení.
- Sdílení dat tříd (CDS) zkracuje dobu spouštění mapováním archivovaných tříd do paměti za běhu. Výchozí archivy CDS [18] (Java 12) a dynamické archivy CDS [19] (Java 13) usnadňují přijetí této funkce bez ručních trénovacích běhů.
- Předběžné načítání a propojování tříd [20] (Java 24) spolu s předběžnou ergonomií příkazového řádku [21] (Java 25) a předběžným profilováním metod [22] (Java 25) zkracují dobu spouštění a rozehřátí díky opětovnému využití práce zachycené v archivu aplikace. Tyto funkce jsou součástí úsilí projektu Leyden o zrychlení spouštění Javy.
Tato vylepšení jsou obzvláště cenná pro cloudově nativní a bezserverové úlohy, kde se rychlé spouštění a malé nároky na prostředky přímo promítají do lepší škálovatelnosti a nižších nákladů.
Sběr odpadků
Java 25 je dodávána s vyzrálými garbage collectory s krátkými prodlevami, vhodnými pro širokou škálu pracovních zátěží:
- ZGC [23] (Java 15) a Shenandoah [24] (Java 15) jsou kolektory připravené na výrobu navržené pro malé doby pozastavení na velkých haldách.
- G1GC zůstává výchozím kolektorem a dále se vylepšuje, včetně připínání regionů [25] (Java 22), které zajišťuje plynulejší interakci s nativním kódem.
- Generační ZGC [26] (Java 21) zlepšuje efektivitu udržováním samostatných generací. Od Java 23 běží ZGC ve výchozím nastavení v generačním režimu [27] a v Java 24 byl odebrán negenerační režim.
- Generační Shenandoah [28] (Java 25) přidává do kolektoru Shenandoah generační režim pro lepší propustnost a odolnost při zatížení paměti.
JVM nastaví výchozí hodnoty GC pro průměrný případ použití. Vylaďte tato výchozí nastavení a další nastavení GC, abyste optimalizovali propustnost nebo latenci podle požadavků vaší aplikace.
Tip
Výchozí systém uvolňování paměti a mnoho výchozích hodnot prostředí JVM se liší v různých verzích Java, takže nastavení vyladěná pro Java 8 nebo 11 už nemusí být pro Java 25 optimální. Spouštěč příkazů Azure pro Java (jaz) přečte limity paměti a procesoru kontejneru cgroup a použije příznaky JVM přizpůsobené verzi a prostředí JDK automaticky.
Diagnostika a pozorovatelnost
Vylepšili jsme diagnostiku napříč verzemi v jazyce i v Java Flight Recorder (JFR):
-
Užitečné výjimky NullPointerException [29] (Java 14) přesně uvádějí, která hodnota byla
null, což urychluje ladění. - Streamování událostí JFR [30] (Java 14) umožňuje nástrojům průběžně zpracovávat profilovací a diagnostická data namísto jejich načítání ze souboru s výpisem.
- Profilace času procesoru JFR [31] (Java 25) přidává profilaci experimentálních metod založených na procesoru v Linuxu.
- JFR spolupracující vzorkování [32] (Java 25) zlepšuje stabilitu vzorkování zásobníku.
- Časování a trasování metod JFR [33] (Java 25) umožňuje čas a trasování konkrétních metod beze změny kódu aplikace.
Zabezpečení a kryptografie
Java 25 posiluje stav zabezpečení platformy, včetně přípravy na postkvantový svět:
- Edwards-Curve Algoritmus digitálního podpisu (EdDSA) [34] (Java 15) přidává moderní schéma vysoce výkonných podpisů.
- Rozhraní API pro mechanismus zapouzdření klíčů [35] (Java 21) poskytuje standardní rozhraní API pro algoritmy KEM.
- Postkvantová kryptografie přináší standardní implementace mechanismu zapouzdření klíče založeného na modulových mřížkách (ML-KEM) [36] (Java 24) a algoritmu pro digitální podpis (ML-DSA) [37] (Java 24).
- Rozhraní API funkce odvození klíče [38] (Java 25) poskytuje standardní rozhraní API pro funkce odvození klíčů.
Nativní interoperabilita
Rozhraní API pro cizí funkce a paměť [39] (Java 22) poskytuje bezpečný, efektivní a čistě Java způsob volání nativních knihoven a přístupu k nativní paměti. Jde o moderní náhradu rozhraní Java Native Interface (JNI), která omezuje nadbytečný opakující se kód a zvyšuje bezpečnost.
Nástroje a knihovny
Několik doplňků zlepšuje každodenní vývoj a snižuje potřebu nástrojů třetích stran:
-
Nástroj pro balení (
jpackage) [40] (Java 16) vytváří nativní instalační programy a balíčky pro Java aplikace. - Jednoduchý webový server [41] (Java 18) poskytuje minimální statický souborový server HTTP pro vytváření prototypů a testování.
- Vylepšené generátory pseudonáhodných čísel [42] (Java 17) přidávají nová rozhraní a implementace pro generování náhodných čísel.
Změny v chování, se kterými je třeba počítat
Některé změny od Java 11 mění výchozí chování, proto je před upgradem zkontrolujte:
-
Důsledné zapouzdření interních částí JDK [43] (Java 17) ve výchozím nastavení blokuje reflexní přístup k většině interních rozhraní API. Kód nebo knihovny, které zasahují do balíčku
sun.*nebo jiných interních balíčků, mohou vyžadovat aktualizaci. - UTF-8 ve výchozím nastavení [44] (Java 18) nastaví UTF-8 jako výchozí znakovou sadu pro standardní rozhraní API Java. Aplikace, které závisely na výchozí znakové sadě specifické pro konkrétní platformu, se můžou chovat odlišně.
-
Označení finalizace za zastaralou s cílem jejího odstranění [45] (Java 18) signalizuje, že
finalize()bude nakonec odstraněna. Migrace natry-with-resources nebojava.lang.ref.Cleaner. - Příprava na zakázání dynamického načítání agentů [46] (Java 21) varuje při načtení agenta do spuštěného prostředí JVM. Některé nástroje pro monitorování a instrumentaci můžou potřebovat změny konfigurace.
Tip
Modernizace aplikací pomocí GitHub Copilotu vám může pomoct tyto změny chování při upgradu automaticky posoudit a vyřešit.
Kontejnery a cloud
Schopnost JVM rozpoznat běh v kontejneru, zavedená pro Docker a další kontejnerová runtime prostředí, se nadále zlepšuje. JVM načítá omezení CPU a paměti nastavená řídicími skupinami (cgroups) kontejneru a podle nich určuje velikost heapu a dalších prostředků. V kombinaci s rychlejším spouštěním, menšími nároky na využití a virtuálními vlákny je Java 25 vhodné pro kontejnerizovaná a bezserverová nasazení na Azure.
Pokud spouštíte Java úlohy na Azure kontejnerech nebo virtuálních počítačích, může Azure Launcher příkazů pro Java (jaz) použít výchozí hodnoty JVM optimalizované pro cloud.
Další kroky
Odkazy
[1] Oracle Corporation, "JEP 444: Virtual Threads" (Virtuální vlákna). (Online). K dispozici: https://openjdk.org/jeps/444.
[2] Oracle Corporation, "JEP 491: Synchronizace virtuálních vláken bez připnutí." (Online). K dispozici: https://openjdk.org/jeps/491.
[3] Oracle Corporation, "JEP 506: Oborové hodnoty". (Online). K dispozici: https://openjdk.org/jeps/506.
[4] Oracle Corporation, „JEP 453: Strukturovaná souběžnost (náhled).“ (online). K dispozici: https://openjdk.org/jeps/453.
[5] Oracle Corporation, "JEP 361: Switch Expressions". (Online). K dispozici: https://openjdk.org/jeps/361.
[6] Oracle Corporation, "JEP 394: Pattern Matching for instanceof." (online). K dispozici: https://openjdk.org/jeps/394.
[7] Oracle Corporation, "JEP 395: Records." (Online). K dispozici: https://openjdk.org/jeps/395.
[8] Oracle Corporation, "JEP 409: Uzavřené třídy." (Online). K dispozici: https://openjdk.org/jeps/409.
[9] Oracle Corporation, "JEP 378: Text Blocks." (Online). K dispozici: https://openjdk.org/jeps/378.
[10] Oracle Corporation, „JEP 441: Porovnávání vzorů pro switch.“ (Online). K dispozici: https://openjdk.org/jeps/441.
[11] Oracle Corporation, "JEP 440: Record Patterns" (Vzory záznamů). (Online). K dispozici: https://openjdk.org/jeps/440.
[12] Oracle Corporation, „JEP 431: Sekvenční kolekce.“ (online). K dispozici: https://openjdk.org/jeps/431.
[13] Společnost Oracle Corporation, "JEP 456: Nepojmenované proměnné a vzory". (Online). K dispozici: https://openjdk.org/jeps/456.
[14] Oracle Corporation, "JEP 511: Module Import Declarations" (Deklarace importu modulů). (Online). K dispozici: https://openjdk.org/jeps/511.
[15] Oracle Corporation, „JEP 512: Kompaktní zdrojové soubory a instanční metody main.“ (Online). K dispozici: https://openjdk.org/jeps/512.
[16] Oracle Corporation, "JEP 513: Flexibilní konstrukce těla." (Online). K dispozici: https://openjdk.org/jeps/513.
[17] Oracle Corporation, "JEP 519: Compact Object Headers." (Online). K dispozici: https://openjdk.org/jeps/519.
[18] Společnost Oracle Corporation, "JEP 341: Výchozí archivy CDS". (Online). K dispozici: https://openjdk.org/jeps/341.
[19] Oracle Corporation, "JEP 350: Dynamic CDS Archives." (Online). K dispozici: https://openjdk.org/jeps/350.
[20] Oracle Corporation, "JEP 483: Ahead-of-Time Class Loading & Linking." (Online). K dispozici: https://openjdk.org/jeps/483.
[21] Oracle Corporation, "JEP 514: Ahead-of-Time Command-Line Ergonomics." (Online). K dispozici: https://openjdk.org/jeps/514.
[22] Oracle Corporation, "JEP 515: Ahead-of-Time Method Profiling." (Online). K dispozici: https://openjdk.org/jeps/515.
[23] Oracle Corporation, "JEP 377: ZGC: A Scalable Low-Latency Garbage Collector." (Online). K dispozici: https://openjdk.org/jeps/377.
[24] Oracle Corporation, „JEP 379: Shenandoah: garbage collector s krátkými pauzami.“ [online]. K dispozici: https://openjdk.org/jeps/379.
[25] Oracle Corporation, „JEP 423: Region Pinning for G1.“ (online). K dispozici: https://openjdk.org/jeps/423.
[26] Oracle Corporation, "JEP 439: Generational ZGC." (Online). K dispozici: https://openjdk.org/jeps/439.
[27] Oracle Corporation, "JEP 474: ZGC: Generational Mode by Default." (online). K dispozici: https://openjdk.org/jeps/474.
[28] Oracle Corporation, "JEP 521: Generational Shenandoah." (Online). K dispozici: https://openjdk.org/jeps/521.
[29] Oracle Corporation, "JEP 358: Užitečné výjimky NullPointerException." (Online). K dispozici: https://openjdk.org/jeps/358.
[30] Oracle Corporation, "JEP 349: JFR Event Streaming" (Online). K dispozici: https://openjdk.org/jeps/349.
[31] Oracle Corporation, "JEP 509: JFR profilování času CPU (experimentální)." (Online). K dispozici: https://openjdk.org/jeps/509.
[32] Oracle Corporation, "JEP 518: JFR kooperativní vzorkování." (Online). K dispozici: https://openjdk.org/jeps/518.
[33] Oracle Corporation, "JEP 520: Časování a trasování metod JFR." (Online). K dispozici: https://openjdk.org/jeps/520.
[34] Oracle Corporation, "JEP 339: Edwards-Curve Algoritmus digitálního podpisu (EdDSA)." (Online). K dispozici: https://openjdk.org/jeps/339.
[35] Oracle Corporation, „JEP 452: Key Encapsulation Mechanism API.“ (online). K dispozici: https://openjdk.org/jeps/452.
[36] Oracle Corporation, „JEP 496: Kvantově odolný mechanismus zapouzdření klíče založený na modulových mřížkách.“ (Online). K dispozici: https://openjdk.org/jeps/496.
[37] Oracle Corporation, "JEP 497: Quantum-Resistant Module-Lattice-Based Digital Signature Algorithm." (Online). K dispozici: https://openjdk.org/jeps/497.
[38] Oracle Corporation, "JEP 510: Key Derivation Function API" (Online). K dispozici: https://openjdk.org/jeps/510.
[39] Oracle Corporation, "JEP 454: Foreign Function & Memory API" (Online). K dispozici: https://openjdk.org/jeps/454.
[40] Společnost Oracle Corporation, "JEP 392: Balicí nástroj". (Online). K dispozici: https://openjdk.org/jeps/392.
[41] Oracle Corporation, "JEP 408: Simple Web Server". (Online). K dispozici: https://openjdk.org/jeps/408.
[42] Oracle Corporation, „JEP 356: Vylepšené generátory pseudonáhodných čísel.“ (online). K dispozici: https://openjdk.org/jeps/356.
[43] Oracle Corporation, "JEP 403: Důsledné zapouzdření interních částí JDK." (Online). K dispozici: https://openjdk.org/jeps/403.
[44] Oracle Corporation, "JEP 400: UTF-8 jako výchozí". (Online). K dispozici: https://openjdk.org/jeps/400.
[45] Oracle Corporation, "JEP 421: Vyřazení finalizace pro odebrání". (Online). K dispozici: https://openjdk.org/jeps/421.
[46] Společnost Oracle Corporation, "JEP 451: Příprava na zákaz dynamického načítání agentů." (Online). K dispozici: https://openjdk.org/jeps/451.