Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A Java 25 egy hosszú távon támogatott (LTS) kiadás, ami természetes választássá teszi a jelenleg Java 8-at, 11-et, 17-et vagy 21-et használó csapatok számára. Minden LTS-kiadás több éves frissítéseket és biztonsági javításokat kap, így a Java 25-ös verzióra való áttérés támogatja, biztonságossá teszi az alkalmazásokat, és képes a legújabb teljesítmény- és nyelvi fejlesztések használatára.
A kérdés nem az , hogy át kell-e lépnie egy újabb LTS-kiadásra, hanem az, hogy mikor. Minél tovább vár, annál több változás halmozódik fel az aktuális verzió és a következő támogatott verzió között. A 25-ös Java való áttérésnek egyértelmű előnyei vannak, és az áthelyezés megtervezése a későbbiek helyett hamarabb csökkenti a kockázatot.
A 8. Java óta minden kiadás tartalmaz funkciókat és fejlesztéseket. Az API-ban észrevehető kiegészítések és módosítások érhetők el, valamint az indítási idő, az átviteli sebesség, a memóriahasználat, a méretezhetőség és a fejlesztői hatékonyság javítása. Ez a cikk a leghatásosabb változásokat emeli ki, és a Java 11 LTS-kiadás óta megjelent Java verziókra összpontosít: Java 17, Java 21 és Java 25.
Váltás Java 25-ös verzióra
Fokozatosan áttérhet a Java 25-re. A régebbi JDK-val fejlesztett és létrehozott kód általában Java 25-ös verzión futtatható újrafordítás nélkül. A nagyobb frissítésekhez hasonlóan figyelje az eltávolított API-kat, az elavult csomagokat, a belső API-k használatát és az alapértelmezett viselkedés változásait, különösen a szemétgyűjtés körül.
Ha Java 8-ról vagy 11-ről vált, kezdje a Java 8-ról Java 11-re való átállásról szóló útmutatóval, hogy kezelni tudja a legtöbb kompatibilitást megszakító változást, majd haladjon tovább a Java 17, 21 és 25 felé. Ha már Java 17-et vagy 21-et használ, a Java 25-re való áttérés általában kisebb lépés, mert a modulrendszeren és a legtöbb platformszintű változtatáson már túl van.
Tipp
A GitHub Copilot alkalmazás modernizálásával felmérheti az alkalmazást, megtervezheti a frissítést, és automatikusan alkalmazhatja a kódmódosításokat. Támogatja Java 8., 11., 17., 21. és 25. verzió közötti frissítést, minden módosítás után elkészíti és teszteli a projektet, és segít a jelen cikk későbbi részében ismertetett viselkedésváltozások elhárításában.
Tipp
A régebbi JDK-verziókhoz hangolt JVM-kapcsolók a Java 25-ben elavulttá válhatnak, eltávolíthatják őket, vagy kevésbé optimálisnak bizonyulhatnak. A régi, elavult beállítások továbbvitele helyett engedélyezheti, hogy a Javahoz készült Azure Command Launcher (jaz) automatikusan alkalmazza a JDK-verzióhoz, valamint a konténer vagy a virtuális gép erőforrásaihoz igazított JVM-jelzőket. Az előnyök kihasználásához cserélje le a(z) java parancsot a(z) jaz parancsra az indítási parancsfájlban vagy a(z) Dockerfile esetében.
Magas szintű változások Java 11 óta
Ez a szakasz nem sorolja fel a 8. Java óta végrehajtott összes módosítást. Kiemeli azokat a változásokat, amelyek a legnagyobb hatással vannak a teljesítményre, a méretezhetőségre, a diagnosztikára, a termelékenységre és a biztonságra. E funkciók többsége a Java 17, 21 és 25 kiadásaival jelent meg, és ma már a Java 25-tel elérhető LTS-alap része. Minden funkció megjegyzi a Java kiadást, amelyben integrálták.
Méretezhetőség virtuális szálakkal
A virtuális szálak [1] az operációs rendszer helyett a JVM által felügyelt könnyű szálak, amelyek jelentősen csökkentik a nagy átviteli sebességű alkalmazások írásának és futtatásának költségeit. A virtuális szálakkal egyszerű, kérelemenkénti stílusban írhat kódot, és nagy számú egyidejű műveletre méretezhető, ami ideális az I/O-kötött mikroszolgáltatásokhoz és a kérés-válasz számítási feladatokhoz.
A virtuális szálak véglegesítése Java 21-ben megtörtént. Java 24 eltávolított egy fő korlátozást, mivel lehetővé tette a virtuális szálak szinkronizálását anélkül, hogy rögzítenék a hordozószálaikat [2], ami javítja a blokkokat használó synchronized kód méretezhetőségét.
Strukturált egyidejűség és hatókörön belüli értékek
A hatókörrel rendelkező értékek [3] biztonságos és hatékony módot biztosítanak a nem módosítható adatok megosztására a szálakon belül és között, beleértve a virtuális szálakat is. Ezek a szálalapú változók modern alternatívái, amelyek jól működnek a szál/feladat modellel.
A strukturált egyidejűség [4] a kapcsolódó egyidejű feladatok csoportjait egyetlen munkaegységként kezeli, ami leegyszerűsíti a hibakezelést és a törlést. A Java 21-ben jelent meg először előzetesként, továbbra is fejlődik, és természetes módon együttműködik a virtuális szálakkal.
Nyelvi hatékonyság
A 14–Java 25 közötti Java nyelvi fejlesztések sorozata tömörebbé, biztonságosabbá és könnyebben olvashatóvá teszi a kódot:
-
Switch-kifejezések [5] (Java 14) lehetővé teszik, hogy a
switchértéket adjanak vissza, és tisztább nyílszintaxist használjanak. -
Mintailesztés a következőhöz:
instanceof[6] (Java 16) kiküszöböli az explicit típuskonverzió szükségességét a típusellenőrzést követően. - Rekordok [7] (Java 16) a nem módosítható adatokat értékek rögzített halmazának transzparens hordozóiként modellezik, csökkentve a sablonkód mennyiségét.
- A lezárt osztályok [8] (Java 17) segítségével szabályozhatja, hogy mely osztályok bővíthetik vagy implementálhatják a típusokat.
- A szövegblokkok [9] (Java 15) leegyszerűsítik a többsoros sztringkonstansokat.
-
Mintaegyezés a következőhöz:
switch[10] (Java 21) és rekordminták [11] (Java 21) lehetővé teszik az összetett feltételes logika és az adatok strukturálásának egyértelmű és biztonságos kifejezését. - A szekvenciált gyűjtemények [12] (Java 21) egységes API-t adnak hozzá egy meghatározott találkozási sorrendű gyűjteményekhez, beleértve az első és az utolsó elemekhez való hozzáférést.
- A névtelen változók és minták [13] (Java 22) lehetővé teszik a fel nem használt változók és mintaösszetevők explicit megjelölését.
- A modulimportálási deklarációk [14] (Java 25) lehetővé teszik egy teljes modul exportált csomagjainak importálását egyetlen deklarációval.
- A kompakt forrásfájlok és a példány fő módszerei [15] (Java 25) csökkentik a kis programokhoz szükséges ceremóniát, ami megkönnyíti a Java tanulását és a prototípusok gyorsabb prototípusát.
-
A rugalmas konstruktortestek [16] (Java 25) lehetővé teszik az utasítások futtatását hívás
super(...)előtt, vagythis(...)ami javítja az ellenőrzést és az inicializálást.
Teljesítmény és indítás
Számos futásidejű módosítás javítja az átviteli sebességet, a memóriaigényt és az indítási időt:
- A kompakt objektumfejlécek [17] (Java 25) csökkentik az objektumfejlécek méretét a 64 bites platformokon. Ez a csökkentés csökkenti a halomhasználatot, és javíthatja a terheléselosztással járó számítási feladatok teljesítményét.
- Az osztályadatok megosztása (CDS) futásidőben csökkenti az indítási időt memórialeképezéssel archivált osztályok alapján. Az alapértelmezett CDS-archívumok [18] (Java 12) és a dinamikus CDS-archívumok [19] (Java 13) megkönnyítik ezt a funkciót manuális betanítási futtatások nélkül.
- Az idő előtti osztálybetöltés és összekapcsolás [20] (Java 24) és az idő előtti parancssori ergonómia [21] (Java 25) és az idő előtti módszerprofilozás [22] (Java 25) rövidíti az indítási és bemelegítési időt az alkalmazásarchívumban rögzített munka újrafelhasználásával. Ezek a funkciók Project Leyden azon törekvésének részét képezik, hogy Java gyorsabban induljanak el.
Ezek a fejlesztések különösen értékesek a natív felhőbeli és kiszolgáló nélküli számítási feladatok esetében, ahol a gyors indítás és a kis erőforrásigény közvetlenül jobb skálázást és alacsonyabb költségeket eredményez.
Szemétgyűjtés
A Java 25 kiforrott, rövid szünetidejű szemétgyűjtőket kínál, amelyek a különféle terhelések széles köréhez alkalmasak:
- A ZGC [23] (Java 15) és a Shenandoah [24] (Java 15) a nagy halmokon alacsony szünetidőre tervezett, gyártásra kész gyűjtők.
- A G1GC továbbra is az alapértelmezett gyűjtő, és továbbra is kap fejlesztéseket, beleértve a régió rögzítését [25] (Java 22) a natív kódokkal való zökkenőmentesebb interakció érdekében.
- A generációs ZGC [26] (Java 21) a különálló generációk fenntartásával javítja a hatékonyságot. A Java 23-tól kezdődően a ZGC alapértelmezés szerint generációs módban fut [27], a nem generációs módot pedig a Java 24-ben eltávolították.
- Generációs Shenandoah [28] (Java 25) egy generációs módot ad hozzá a Shenandoah gyűjtőhöz a nagyobb áteresztőképesség és a memórianyomás melletti jobb ellenálló képesség érdekében.
A JVM beállítja a GC alapértelmezett értékét az átlagos használati esethez. Ezeket az alapértelmezett beállításokat és egyéb GC-beállításokat az alkalmazás igényeinek megfelelően optimalizálhatja az átviteli sebesség vagy a késés optimalizálása érdekében.
Tipp
Az alapértelmezett szemétgyűjtő és a JVM számos alapértelmezett beállítása eltér a különböző Java-verziók között, így a Java 8-ra vagy 11-re hangolt beállítások Java 25-ön már nem feltétlenül optimálisak. A Java () jaz beolvassa a tároló cgroup memória- és CPU-korlátait, és automatikusan alkalmazza a JDK-verzióra és környezetre szabott JVM-jelzőket.
Diagnosztika és megfigyelhetőség
A diagnosztika minden kiadásban javult, mind a nyelv, mind a Java Flight Recorder (JFR):
-
A hasznos NullPointerExceptions [29] (Java 14) pontosan leírja, hogy melyik változó volt
null, ami felgyorsítja a hibakeresést. - JFR-eseményfolyam [30] (Java 14) lehetővé teszi, hogy az eszközök a profilalkotáshoz és diagnosztikához használt adatokat folyamatosan dolgozzák fel, ne pedig kiíratási fájlból.
- JFR CPU-időalapú profilozás [31] (Java 25) bevezeti a kísérleti, CPU-időn alapuló metódusprofilozást Linuxon.
- JFR kooperatív mintavételezés [32] (Java 25) javítja a veremmintavételezés stabilitását.
- A JFR-metódus időzítése és nyomon követése [33] (Java 25) lehetővé teszi adott metódusok időzítését és nyomon követését az alkalmazáskód módosítása nélkül.
Biztonság és titkosítás
Java 25 megerősíti a platform biztonsági pozícióját, beleértve a kvantum utáni világra való felkészülést is:
- Edwards-Curve digitális aláírási algoritmus (EdDSA) [34] (Java 15) modern, nagy teljesítményű aláírási sémát ad hozzá.
- A Key Encapsulation Mechanism API [35] (Java 21) szabványos API-t biztosít a KEM-algoritmusokhoz.
- A kvantumbiztos titkosítás a modul-rácsalapú kulcsbefoglaló mechanizmus (ML-KEM) [36] (Java 24) és a digitális aláírási algoritmus (ML-DSA) [37] (Java 24) standard implementációit adja hozzá.
- A Key Derivation Function API [38] (Java 25) egy standard API-t biztosít a fő származtatott függvényekhez.
Natív együttműködés
A Foreign Function and Memory API [39] (Java 22) biztonságos, hatékony és tiszta Java módot biztosít a natív kódtárak meghívására és a natív memóriához való hozzáférésre. A Java natív interfész (JNI) modern alternatívája, amely csökkenti a sablonkód mennyiségét, és javítja a biztonságot.
Eszközök és kódtárak
Számos kiegészítés javítja a mindennapi fejlődést, és csökkenti a külső eszközök iránti igényt:
-
A csomagolóeszköz (
jpackage) [40] (Java 16) natív telepítőket és csomagokat hoz létre Java alkalmazásokhoz. - Az egyszerű webkiszolgáló [41] (Java 18) minimális statikus fájl http-kiszolgálót biztosít a prototípus-készítéshez és teszteléshez.
- A továbbfejlesztett álnevesítési számgenerátorok [42] (Java 17) új interfészeket és implementációkat adnak hozzá a véletlenszerű számgeneráláshoz.
A tervezéshez szükséges viselkedésváltozások
A 11-Java óta bekövetkezett egyes módosítások módosítják az alapértelmezett viselkedést, ezért a frissítés előtt tekintse át őket:
-
A JDK belső elemeinek erős enkapszulációja [43] (Java 17) alapértelmezés szerint letiltja a reflektív hozzáférést a legtöbb belső API-hoz. Azok a kódok vagy függvénytárak, amelyek a
sun.*vagy más belső csomagok elemeit használják, frissítésre szorulhatnak. - Az UTF-8 alapértelmezés szerint [44] (Java 18) teszi az UTF-8-at a standard Java API-k alapértelmezett karakterkészleteként. A platformspecifikus alapértelmezett karakterkészletre támaszkodó alkalmazások eltérően viselkedhetnek.
-
A finalizálás eltávolítás céljából történő elavulttá nyilvánítása [45] (Java 18) azt jelzi, hogy a
finalize()elemet végül el fogják távolítani. Váltson át atry-with-resources vagy ajava.lang.ref.Cleanerhasználatára. - Az ügynökök dinamikus betöltésének letiltására való felkészülés [46] (Java 21) figyelmeztet, ha egy ügynök betöltődik egy futó JVM-be. Egyes monitorozási és rendszerállapot-eszközök konfigurációs módosításokat igényelhetnek.
Tipp
A GitHub Copilot alkalmazás modernizálása segíthet ezeknek a viselkedésváltozásoknak a frissítéskor történő automatikus felmérésében és elhárításában.
Tárolók és felhő
A Dockerhez és más tároló-futtatókörnyezetekhez bevezetett JVM-tárolótudatosság tovább javul. A JVM kiolvassa a konténerek vezérlőcsoportjai (cgroups) által beállított CPU- és memóriakorlátokat, és ennek megfelelően méretezi a heapet és más erőforrásokat. A gyorsabb indítással, kisebb erőforrásigénylel és virtuális szálakkal kombinálva a 25-ös Java kiválóan alkalmas tárolóalapú és kiszolgáló nélküli üzembe helyezésre Azure.
Ha Azure tárolókon vagy virtuális gépeken futtat Java számítási feladatokat, a Java () jaz felhőoptimalizált, verziónak megfelelő JVM-alapértelmezéseket alkalmazhat Önnek.
Következő lépések
References
[1] Oracle Corporation, "JEP 444: Virtual Threads." (Online). Elérhető: https://openjdk.org/jeps/444.
[2] Oracle Corporation, "JEP 491: Virtuális szálak szinkronizálása lekötés nélkül." (Online). Elérhető: https://openjdk.org/jeps/491.
[3] Oracle Corporation, "JEP 506: Hatókörhöz kötött értékek." (Online). Elérhető: https://openjdk.org/jeps/506.
[4] Oracle Corporation, "JEP 453: Strukturált konkurencia (előzetes)." (online). Elérhető: https://openjdk.org/jeps/453.
[5] Oracle Corporation, „JEP 361: Switch Expressions.” (Online). Elérhető: https://openjdk.org/jeps/361.
[6] Oracle Corporation, "JEP 394: Pattern Matching for instanceof". (Online). Elérhető: https://openjdk.org/jeps/394.
[7] Oracle Corporation, "JEP 395: Records." (Online). Elérhető: https://openjdk.org/jeps/395.
[8] Oracle Corporation, "JEP 409: Zárolt osztályok." (online). Elérhető: https://openjdk.org/jeps/409.
[9] Oracle Corporation, "JEP 378: Text Blocks." (online). Elérhető: https://openjdk.org/jeps/378.
[10] Oracle Corporation, „JEP 441: Mintázatillesztés a switch utasításhoz.” (online). Elérhető: https://openjdk.org/jeps/441.
[11] Oracle Corporation, „JEP 440: Record Patterns.” (Online elérhető). Elérhető: https://openjdk.org/jeps/440.
[12] Oracle Corporation, „JEP 431: Szekvenciális gyűjtemények.” (Online elérhető). Elérhető: https://openjdk.org/jeps/431.
[13] Oracle Corporation, "JEP 456: Névtelen változók & minták." (Online). Elérhető: https://openjdk.org/jeps/456.
[14] Oracle Corporation, "JEP 511: Module Import Deklarációk". (Online). Elérhető: https://openjdk.org/jeps/511.
[15] Oracle Corporation, "JEP 512: Kompakt forrásfájlok és példányszintű main metódusok." (Online). Elérhető: https://openjdk.org/jeps/512.
[16] Oracle Corporation, "JEP 513: Rugalmas konstruktor törzsek." (Online). Elérhető: https://openjdk.org/jeps/513.
[17] Oracle Corporation, "JEP 519: Compact Object Headers." (Online). Elérhető: https://openjdk.org/jeps/519.
[18] Oracle Corporation, "JEP 341: Alapértelmezett CDS-archívumok." (Online). Elérhető: https://openjdk.org/jeps/341.
[19] Oracle Corporation, "JEP 350: Dynamic CDS Archives." (Online). Elérhető: https://openjdk.org/jeps/350.
[20] Oracle Corporation, "JEP 483: Ahead-of-Time Class Loading & Linking." (Online). Elérhető: https://openjdk.org/jeps/483.
[21] Oracle Corporation, "JEP 514: Az előre történő parancssori ergonómiája." (Online). Elérhető: https://openjdk.org/jeps/514.
[22] Oracle Corporation, „JEP 515: Előzetes metódusprofilozás.” (online). Elérhető: https://openjdk.org/jeps/515.
[23] Oracle Corporation, "JEP 377: ZGC: Egy skálázható, alacsony késleltetésű szemétgyűjtő." (Online). Elérhető: https://openjdk.org/jeps/377.
[24] Oracle Corporation, „JEP 379: Shenandoah: alacsony szünetidejű szemétgyűjtő.” (online). Elérhető: https://openjdk.org/jeps/379.
[25] Oracle Corporation, „JEP 423: Régiórögzítés a G1-hez.” (Online elérhető). Elérhető: https://openjdk.org/jeps/423.
[26] Oracle Corporation, "JEP 439: Generational ZGC." (Online). Elérhető: https://openjdk.org/jeps/439.
[27] Oracle Corporation, "JEP 474: ZGC: Generációs mód alapértelmezés szerint." (Online). Elérhető: https://openjdk.org/jeps/474.
[28] Oracle Corporation, "JEP 521: Generational Shenandoah." (Online). Elérhető: https://openjdk.org/jeps/521.
[29] Oracle Corporation, "JEP 358: Hasznos nullmutató-kivételek." (online). Elérhető: https://openjdk.org/jeps/358.
[30] Oracle Corporation, "JEP 349: JFR Event Streaming." (Online). Elérhető: https://openjdk.org/jeps/349.
[31] Oracle Corporation, "JEP 509: JFR CPU-időprofilozás (Kísérleti)." (Online). Elérhető: https://openjdk.org/jeps/509.
[32] Oracle Corporation, "JEP 518: JFR kooperatív mintavételezés." (Online). Elérhető: https://openjdk.org/jeps/518.
[33] Oracle Corporation, "JEP 520: JFR Method Timing & Tracing." (Online). Elérhető: https://openjdk.org/jeps/520.
[34] Oracle Corporation, "JEP 339: Edwards-Curve Digital Signature Algorithm (EdDSA)." (Online). Elérhető: https://openjdk.org/jeps/339.
[35] Oracle Corporation, "JEP 452: Kulcsbetokozási mechanizmus API." (online). Elérhető: https://openjdk.org/jeps/452.
[36] Oracle Corporation, „JEP 496: Kvantumrezisztens, modulrács-alapú kulcsbekapszulázási mechanizmus.” (online). Elérhető: https://openjdk.org/jeps/496.
[37] Oracle Corporation, "JEP 497: Quantum-Resistant Module-Lattice-Based Digital Signature Algorithm." (Online). Elérhető: https://openjdk.org/jeps/497.
[38] Oracle Corporation, "JEP 510: Kulcsszármaztatási függvény API." (online). Elérhető: https://openjdk.org/jeps/510.
[39] Oracle Corporation, "JEP 454: Foreign Function & Memory API." (Online). Elérhető: https://openjdk.org/jeps/454.
[40] Oracle Corporation, "JEP 392: Packaging Tool." (Online). Elérhető: https://openjdk.org/jeps/392.
[41] Oracle Corporation, "JEP 408: Simple Web Server." (Online). Elérhető: https://openjdk.org/jeps/408.
[42] Oracle Corporation, „JEP 356: Továbbfejlesztett álvéletlenszám-generátorok.” (online). Elérhető: https://openjdk.org/jeps/356.
[43] Oracle Corporation, "JEP 403: A JDK belső elemeinek erőteljes tokozása." (Online). Elérhető: https://openjdk.org/jeps/403.
[44] Oracle Corporation, "JEP 400: UTF-8 alapértelmezés szerint." (Online). Elérhető: https://openjdk.org/jeps/400.
[45] Oracle Corporation, „JEP 421: Az objektumok véglegesítésének eltávolítás céljából történő elavulttá nyilvánítása.” (online). Elérhető: https://openjdk.org/jeps/421.
[46] Oracle Corporation, "JEP 451: Felkészülés az ágensek dinamikus betöltésének letiltására." (online). Elérhető: https://openjdk.org/jeps/451.