Hat hónapnyi fejlesztés után az Oracle kiadta a Java SE 25 platformot (Java Platform, Standard Edition 24), amelynek referencia-implementációjaként az OpenJDK nyílt projektet használják. Az elavult funkciók eltávolítása kivételével a Java SE 25 megőrzi a visszafelé kompatibilitást a régebbi Java platform verziókkal — a korábban írt Java-projektek többsége változtatások nélkül működni fog az új verzió alatt. A Java SE 25 telepítésre kész verziói (JDK, JRE és Server JRE) elérhetőek Linuxhoz (x86_64, AArch64), Windows-hoz (x86_64) és macOS-hez (x86_64, AArch64). Az OpenJDK keretein belül fejlesztett referencia-implementáció teljesen nyílt GPLv2 licenc alatt érhető el, a GNU ClassPath kivételekkel, amelyek lehetővé teszik a kereskedelmi termékekkel való dinamikus kapcsolódást.
A Java SE 25 a hosszú távú támogatású kiadások közé tartozik, amelynek frissítései 2033-ig fognak megjelenni (nyilvános frissítések 2030 szeptemberéig érkeznek). A hosszú távú támogatású ágként (LTS) továbbra is támogatott a Java SE 17 és 21, amelynek frissítései 2029 és 2031-ig jelennek meg (nyilvános — 2026 és 2028-ig). A Java SE 8 és 11 LTS ágak kibővített támogatása 2030-ig, illetve 2032-ig tart.
A Java SE 25-ben bemutatott újdonságok (1, 2, 3, 4):
- Bevezettünk egy kísérleti API-t, a StableValue-t, amely lehetővé teszi a változatlan adatokat tartalmazó objektumokkal való munkát, amelyeket a JVM konstansként kezel. Az ilyen objektre teljesítményoptimalizálások vonatkoznak, hasonlóan a "final" kulcsszóval rendelkező mezőkhöz. A StableValue API elválasztja a tartós értékek létrehozását és inicializálását, garantálja, hogy az érték csak egyszer inicializálható, csökkenti a programok indítási idejét, és lehetővé teszi a felhasználói kódban a konstanszerűsítési optimalizálások (constant-folding) alkalmazását, amelyek korábban csak a JDK belső kódjában voltak használatosak. class Application { // Korábban: // static final UserService USERS = new UserService(); // Most: static final StableValue USERS = StableValue.of(); public static UserService users() { return USERS.orElseSet(UserService::new); } }
- Bevezettünk egy kísérleti API-t a kriptográfiai kulcsok, tanúsítványok és visszavont tanúsítványok listáinak kódolásához és dekódolásához, PEM (Pivacy-Enhanced Mail) formátum használatával.
- Bevezetésre került a korlátozott értékek (Scoped Values) támogatása, amely lehetővé teszi az immutable adatok megosztását szálak között és hatékony adatcserét a gyermek szálak között (az értékek öröklődnek). A Scoped Values a szál-specifikus változók (thread-local variables) mechanizmusát hivatottak helyettesíteni, és hatékonyabbak, ha nagyon nagy számú virtuális szálat használnak (ezrek vagy milliók szál). A fő különbség a Scoped Values és a szál-specifikus változók között az, hogy az előbbiek egyszer írhatók, a későbbiekben nem módosíthatók, és csak a szál futási ideje alatt hozzáférhetők.
- Bevezetésre került az API a kulcsképző kriptográfiai funkciók (KDF, key derivation function) használatához, amelyek lehetővé teszik további, szükséges hosszúságú kulcsok létrehozását egy titkos kulcs (például jelszó) és egy tetszőleges adatcsoport alapján.
- Eltávolításra került a kód és az építési szkriptek a 32-bites x86 rendszerek támogatásához. A 32-bites x86 rendszerek támogatásának leállítása lehetővé tette a JDK építési és tesztelési infrastruktúrájának egyszerűsítését, valamint olyan lehetőségek megvalósítását tette lehetővé, amelyek platform-specifikusak, anélkül, hogy fallback kezelőket kellett volna létrehozni a 32-bites x86 rendszerekhez.
- Bevezetésre került egyetlen kifejezés, az «import module M», lehetősége, amely lehetővé teszi az összes, a megadott modul által exportált csomag egyszerre történő importálását. Ez a módosítás jelentősen leegyszerűsíti a modul könyvtárak újrahasználatát, lehetővé téve a könyvtárak és osztályok csatlakoztatását anélkül, hogy meg kellene határozni a csomaghierarchiában elfoglalt helyüket. Például az «import module java.base» megadásával importálni fogja az összes 54 csomagot, amely a java.base modulban található, amelyeket korábban külön-külön kellett volna említeni (például «import java.io.*», «import java.util.*» stb.).
- Javasolt egy kompakt programozási forma, amely hasznos lehet tanulás során és kis alkalmazások fejlesztésekor. A kompakt formában nincs szükség felesleges osztályok meghatározására, automatikusan importálásra kerülnek a tipikus API-k, és elérhetők az egyszerűsített bemenet/kimeneti metódusok. Például a «Hello, World!» alkalmazás a következőképpen egyszerűsíthető: void main() { IO.println(«Hello, World!»); }
- Engedélyezett a kifejezések megadás a kifejezés-építőkben a super(...) hívása előtt, amely kifejezett hívást végez a szülőosztály konstruktora számára az öröklött osztály konstruktorából, ha ezek a kifejezések nem hivatkoznak a konstruktor által létrehozott példányra. class Outer { void hello() { System.out.println("Hello"); } class Inner { Inner() { hello(); super(); } } }
- Hozzáadva a Shenandoah szemétgyűjtő generatív üzemmódja, amely külön kezeli a régi és a nemrég létrehozott objektumokat a rövid életű objektumok tisztításának hatékonyságának növelése érdekében. Az új üzemmód előre jelezhetőbb áteresztőképességet, terhelésváltozásokkal szembeni ellenállóságot és a memóriafogyasztás csökkentését biztosítja a szemétgyűjtés során. A Shenandoah ütemező célja a megállási idők csökkentése a szemétgyűjtés alatt azáltal, hogy nagyobb munkamennyiséget párhuzamosan végez a Java alkalmazások futtatásával.
- Egyszerűsödött a gyorsítótár létrehozása az előre (Ahead-of-Time) betöltés és osztályok összeállítása érdekében, amely lehetővé teszi a HotSpot JVM gyorsabb indítását azáltal, hogy az osztályok már betöltött és összeállított állapotban érhetők el. Indításkor már nincs szükség külön műveletekre az aktivitás rögzítésére és a gyorsítótár létrehozására, elegendő egy parancs: java -XX:AOTCacheOutput=app.aot -cp app.jar com.example.App …
- A HotSpot Java VM indításakor lehetőség nyílik a módszerek végrehajtási profiljának használatára, amelyeket az alkalmazás előző indításakor szereztek be. A változás lehetővé teszi, hogy a JIT fordító ne halmozza fel a statisztikát, és egyből natív kódot generáljon a profil létrehozásának várakozása nélkül.
- A HotSpot JVM-ben megvalósítva a kompakt objektumfejlécek támogatása, amelyek mérete 64 bites rendszereken 96-ról 64 bitre csökkent (12 bájról 8 bájtra). A fejlécek méretének csökkentése lehetővé teszi a halom méretének csökkentését és a gyorsítótár munkájának hatékonyságának növelését.
- A javasolt API Vector tesztverzióa, amely vektorgyorsítást biztosít a vektorisoktori számításokhoz, a x86_64 és AArch64 processzorok vektoros utasításainak használatával lehetővé teszi, hogy párhuzamosan több értékre (SIMD) alkalmazzunk műveleteket. Ezzel szemben a HotSpot JIT-compiler által kínált automatikus vektorizálási lehetőségekkel a új API lehetőséget ad a vektorizálás kifejezett kezelésére az adatok párhuzamos feldolgozása érdekében.
- Tesztelésre javasolták az ötödik előzetes verziót az API számára, amely a strukturált párhuzamosságot (Structured Concurrency) biztosít, egyszerűsítve ezzel a több szálon futó alkalmazások fejlesztését azáltal, hogy a különböző szálakban végzett több feladatot egyetlen blokként kezel.
- A mintaillesztési mechanizmusban bemutatták a primitív típusok (int, byte, char és egyéb alapvető típusok, amelyek nem objektumok) használatának harmadik előzetes verzióját mindenféle sablonban, az «instanceof» operátorban és a «switch» blokkokban. switch (x.getStatus()) { case 0 -> «rendben»; case 1 -> «figyelmeztetés»; case 2 -> «hiba»; case int i -> «ismeretlen állapot: » + i; } if (i instanceof byte b) { … b … }
- A JDK Flight Recorder (JFR) kísérleti támogatást kapott a Linux platformon a CPU-erőforrások pontosabb nyomon követéséhez. Az egyes konstrukciók futási idejéről szóló információk színes „FlameGraph” diagramokon vizualizálhatók.
- Növelték a JDK Flight Recorder (JFR) stabilitását a Java szálak veremmintázatának aszinkron mintavételezésekor azzal, hogy a hívási veremet csak a „biztonságos pontok” (safepoints) körüli részre vezetjük.
- A JDK Flight Recorder (JFR) eszközöket kapott a módszerek futási idejének nyomozásához és értékeléséhez. Támogatja a meghatározott módszerek hívásainak nyomozását és pontos statisztikák rögzítését, amelyek olyan metrikákat tartalmaznak, mint a futási idő és a hívások száma.
Forrás: opennet.ru
