Po šestih mesecih razvoja je podjetje Oracle objavilo platformo Java SE 25 (Java Platform, Standard Edition 24), katere referenčna implementacija je odprt projekt OpenJDK. Z izjemo odstranitve nekaterih zastarelih funkcij v Java SE 25 je bila ohranjena povratna združljivost s prejšnjimi različicami platforme Java – večina prej napisanih Java projektov bo brez sprememb delovala z novo različico. Pripravljene zbirke Java SE 25 (JDK, JRE in Server JRE) so na voljo za Linux (x86_64, AArch64), Windows (x86_64) in macOS (x86_64, AArch64). Referenčna implementacija Java SE 25, razvita v okviru projekta OpenJDK, je popolnoma odprta pod licenco GPLv2 z izjemami GNU ClassPath, ki omogočajo dinamično povezovanje s komercialnimi proizvodi.
Java SE 25 je uvrščen med izdaje z razširjenim časom podpore, nadgradnje zanj bodo izhajale do leta 2033 (javne nadgradnje bodo na voljo do septembra 2030). Kot veja z dolgo življenjsko dobo (LTS) se še naprej vzdržujeta tudi veji Java SE 17 in 21, nadgradnje zanje pa bodo izhajale do leta 2029 in 2031, ustrezno (javne – do 2026 in 2028). Razširjena podpora LTS vej Java SE 8 in 11 bo trajala do leta 2030 in 2032.
Med novostmi, predstavljenimi v Java SE 25 (1, 2, 3, 4):
- Dodana je eksperimentalna API StableValue za delo z objekti, ki vsebujejo nespremenljive podatke in se obravnavajo v JVM kot konstante. Na takšne objekte se uporabljajo optimizacije zmogljivosti, podobne poljem s ključnimi besedami „final“. API StableValue ločuje ustvarjanje stalnih vrednosti in njihovo inicializacijo, zagotavlja, da je vrednost možno inicializirati le enkrat, skrajša čas nalaganja programov in omogoča uporabo optimizacij zmanjševanja konstant (constant-folding) v uporabniškem kodu, ki so bile prej uporabljene le v notranji kodi JDK. class Application { // Bilo: // static final UserService USERS = new UserService(); // Postalo: static final StableValue USERS = StableValue.of(); public static UserService users() { return USERS.orElseSet(UserService::new); } }
- Dodana je eksperimentalna API za kodiranje in dekodiranje objektov s kriptografskimi ključi, certifikati in seznami preklicanih certifikatov, z uporabo formata PEM (Pivacy-Enhanced Mail).
- Dodana je podpora za omejene vrednosti (Scoped Values), ki omogočajo skupno rabo nespremenljivih podatkov v tokovih ter učinkovito izmenjavo podatkov med podtokovi (vrednosti se dedujejo). Scoped Values se razvijajo kot nadomestilo za mehanizem spremenljivk, lokalnih za tok (thread-local variables) in so bolj učinkovite pri uporabi zelo velikega števila virtualnih tokov (tisoči in milijoni tokov). Glavna razlika med Scoped Values in spremenljivkami lokalnimi za tok je ta, da se prve zapišejo enkrat, jih ni mogoče spremeniti in ostanejo dostopne le med izvajanjem toka.
- Dodana je API za uporabo kriptografskih funkcij derivacije ključev (KDF, key derivation function), ki omogočajo oblikovanje dodatnih ključev zahtevane dolžine na podlagi tajnega ključa (na primer, gesla) in poljubne množice podatkov.
- Odstranjena je koda in scenariji za sestavljanje za podporo 32-bitnim sistemom x86. Prenehanje podpore 32-bitnim sistemom x86 je poenostavilo infrastrukturo za sestavljanje in testiranje JDK, prav tako pa je omogočilo izvajanje funkcionalnosti, povezanih s platformami, brez ustvarjanja fallback obdelovalcev za 32-bitne sisteme x86.
- Dodana je možnost uporabe enega izraza „import module M“ za uvoz vseh paketov, ki jih izvaža navedeni modul. Sprememba bistveno poenostavi ponovno uporabo modularnih knjižnic, saj omogoča povezovanje knjižnic in razredov brez določanja njihovega mesta v hierarhiji paketov. Na primer, navedba „import module java.base“ bo povzročila uvoz vseh 54 paketov, ki so del modula java.base, ki bi jih bilo prej treba omenjati posamično („import java.io.*“, „import java.util.*“ in tako naprej).
- Predlagana je kompaktna različica oblikovanja programov, ki bi lahko bila koristna za izobraževanje in pri razvoju manjših aplikacij. V kompaktni obliki ni potrebno določanje nepotrebnih razredov, avtomatsko se uvažajo tipični API-ji in na voljo so poenostavljene metode vnosa/izvoda. Na primer, aplikacijo „Hello, World!“ lahko zmanjšamo na: void main() { IO.println(„Hello, World!“); }
- Dovoljeno je navajanje v konstruktorjih izrazov pred klicem super(…), ki se uporablja za izrecen klic konstruktorja nadrazreda iz konstruktorja podrazreda, če se ti izrazi ne nanašajo na ustvarjeni primer, ki ga ustvari konstruktor. class Outer { void hello() { System.out.println("Hello"); } class Inner { Inner() { hello(); super(); } } }
- Dodana je generativna način delovanja zbiralnika smeti Shenandoah, pri katerem se ločeno obravnavata starejši in nedavno ustvarjeni objekti za povečanje učinkovitosti čiščenja objektov z majhno življenjsko dobo. Novi način zagotavlja bolj predvidljivo propustnost, odpornost na spremembe obremenitve in zmanjšano porabo pomnilnika pri zbiranju smeti. Načrtovalnik Shenandoah si prizadeva skrajšati čas ustavitve med zbiranjem smeti z izvajanjem večjega obsega dela vzporedno z izvajanjem aplikacij Java.
- Poenostavljeno je ustvarjanje predpomnilnika za vnaprejšnje (Ahead-of-Time) nalaganje in povezovanje razredov, kar omogoča hitrejši zagon HotSpot JVM s tem, da se razredi uporabljajo v že naloženem in povezanem stanju. Ob zagonu ne zahtevajo več ločenih operacij za zapis aktivnosti in ustvarjanje predpomnilnika, temveč zadostuje ena ukazna vrstica: java -XX:AOTCacheOutput=app.aot -cp app.jar com.example.App …
- Ob zagonu HotSpot Java VM je omogočena uporaba profilov izvajanja metod, pridobljenih pri prejšnjem zagonu aplikacije. Sprememba omogoča JIT-kompilatorju, da se izogne zbiranju statistike in takoj začne generirati nativno kodo, ne da bi čakal na oblikovanje profila.
- V HotSpot JVM je uvedena podpora za kompaktne naslove objektov, katerih velikost je na 64-bitnih sistemih zmanjšana s 96 na 64 bitov (s 12 na 8 bajtov). Zmanjšanje velikosti naslovov omogoča skrajšanje velikosti kupčine in povečanje učinkovitosti delovanja predpomnilnika.
- Predlagana je testna implementacija API Vector, ki nudi funkcije za vektorske izračune, ki se izvajajo z uporabo vektorskih inštrukcij procesorjev x86_64 in AArch64 ter omogoča hkratno izvajanje operacij na več vrednostih (SIMD). V nasprotju z avtomatsko vektorizacijo skalarnih operacij, ki jo nudi JIT-kompilator HotSpot, nov API omogoča izrecno upravljanje z vektorizacijo za paralelno obdelavo podatkov.
- Predlagan je peti preliminarni različica API za strukturirano paralelnost (Structured Concurrency), ki poenostavi razvoj večnitnih aplikacij s tem, da obravnava več nalog, ki se izvajajo v različnih niti, kot enoten blok.
- V mehanizmu ujemanja z vzorcem je predlagana tretja preliminarna različica možnosti uporabe primitiven tipov (int, byte, char in drugi osnovni tipi, ki niso objekti) v vseh vrstah predlog, v operatorju 'instanceof' in v blokih 'switch'. switch (x.getStatus()) { case 0 -> 'okej'; case 1 -> 'opozorilo'; case 2 -> 'napaka'; case int i -> 'nepoznan status: ' + i; } if (i instanceof byte b) { … b … }
- V JDK Flight Recorder (JFR) je bila dodana eksperimentalna podpora za profiliranje z natančnejšim spremljanjem porabe virov CPU na platformi Linux. Informacije o času izvajanja različnih konstrukcij so lahko vizualizirane s pomočjo barvnih diagramov 'FlameGraph'.
- Povečana je stabilnost delovanja JDK Flight Recorder (JFR) pri asinhronem vzorčenju skladov niti Java s tem, da se obide sklad klicev le na 'varnih točkah' (safepoints).
- V JDK Flight Recorder (JFR) so dodana orodja za sledenje in ocenjevanje časa izvajanja metod. Podprto je sledenje skladu klicev specifičnih metod in zapis natančne statistike o klicih metod, ki vključuje metrike, kot so čas izvajanja in število klicev.
Izvor: opennet.ru
