Po šestih mesecih razvoja je podjetje Oracle objavilo platformo Java SE 24 (Java Platform, Standard Edition 24), katere referenčna implementacija temelji na odprtem projektu OpenJDK. Z izjemo odstranitve nekaterih zastarelih funkcionalnosti v Java SE 24 je ohranjena povratna združljivost s prejšnjimi različicami platforme Java — večina prej napisanih Java projektov bo brez sprememb delovala v novi različici. Pripravljene za namestitev različice Java SE 24 (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 24, razvita v okviru projekta OpenJDK, je popolnoma odprta pod licenco GPLv2 z izjemo GNU ClassPath, ki dovoljuje dinamično povezovanje s komercialnimi izdelki.
Java SE 24 spada med izdaje z običajnim rokom podpore, posodobitve za katero bodo izhajale do naslednje izdaje. Kot veja z dolgim rokom podpore (LTS) se priporoča uporaba Java SE 21 ali Java SE 17, posodobitve za kateri bosta izhajali do leta 2031 in 2029 (javne do leta 2028 in 2026). Podaljšana podpora za LTS vejo Java SE 8 bo trajala do leta 2030, medtem ko bo Java SE 11 podprta do leta 2032. Naslednja LTS izdaja bo jesenska Java SE 25.
Med novostmi, predstavljenimi v Java SE 24, so:
- Predlagan je eksperimentalni generativni način delovanja zbiralnika smeti Shenandoah, pri katerem se ločeno obravnavajo stari in nedavno ustvarjeni objekti za povečanje učinkovitosti čiščenja objektov z majhnim časom življenja. Nov način zagotavlja bolj predvidljivo prepustnost, odpornost na spremembe obremenitve in zmanjšano porabo pomnilnika med zbiranjem smeti. Načrtovalnik Shenandoah si prizadeva skrajšati čas zaustavitev med zbiranjem smeti z izvajanjem večjega obsega dela vzporedno z izvajanjem Java aplikacij.
- V HotSpot JVM je bila izvedena eksperimentalna 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 zmanjšanje velikosti kupčine in povečanje učinkovitosti delovanja predpomnilnika.
- V zbiralniku odpadkov G1 je poenostavljena izvedba pregrad, ki spremljajo dostop aplikacije do pomnilnika. V novi različici so se operacije širjenja pregrad prenesle na kasnejšo fazo prevajanja v C2 JIT. Izvedeni testi kažejo, da takšna prenesena operacija omogoča znižanje stroškov v JIT-prevajalniku C2 za 10-20% glede na aplikacijo.
- Dodano je API za uporabo kriptografskih funkcij generiranja ključev (KDF, funkcija izpeljave ključev), ki omogočajo generiranje dodatnih ključev potrebne dolžine na podlagi tajnega ključa (na primer gesla) in poljubnega nabora podatkov. KDF API ima zaenkrat status predogleda (preview).
- Dodana je možnost predhodne (Ahead-of-Time) nalaganja in sestavljanja razredov. Ta sprememba omogoča pospešitev zagona HotSpot JVM z zagotavljanjem razredov, ki se uporabljajo v aplikaciji, v že naloženem in sestavljenem stanju. Med prvim zagonom aplikacije se stanje vseh razredov shrani v predpomnilnik in se pri naslednjih zagonih uporablja za pospešitev nalaganja.
- Dodano je API Class-File za razčlenjevanje, generiranje in pretvarjanje datotek z razredi Java.
ClassFile cf = ClassFile.of(); ClassModel classModel = cf.parse(bytes); byte[] newBytes = cf.build(classModel.thisClass().asSymbol(), classBuilder -> { for (ClassElement ce : classModel) { if (!(ce instanceof MethodModel mm && mm.methodName().stringValue().startsWith("debug"))) { classBuilder.with(ce); } } });
- Dodano je razširjeno API Stream, ki podpira določanje lastnih vmesnih operacij, ki so lahko koristne v primerih, ko obstoječe vgrajene vmesne operacije niso zadostne za želeno pretvorbo podatkov. Lastni obdelovalci se povežejo z novo vmesno operacijo Stream::gather(Gatherer), ki obdela elemente toka s predpisanim uporabniškim obdelovalcem. jshell> Stream.of(1,2,3,4,5,6,7,8,9).gather(new WindowFixed(3)).toList() $1 ==>> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
- Predlagana je četrta preliminarna implementacija omejenih vrednosti (Scoped Values), ki omogočajo skupno rabo nespremenljivih podatkov v toku in učinkovito izmenjavo podatkov med podtoki (vrednosti se dedujejo). Scoped Values se razvijajo za zamenjavo mehanizma lokalnih spremenljivk za tok (thread-local variables) in so bolj učinkoviti pri uporabi zelo velikega števila virtualnih tokov (tisoči in milijoni tokov). Glavna razlika med Scoped Values in lokalnimi spremenljivkami za tok je, da se prve zapišejo enkrat, jih kasneje ni mogoče spremeniti, in so dostopne le med izvajanjem toka.
- V mehanizme ujemanja vzorca je bila dodana preliminarna podpora za uporabo primitivnih tipov (int, byte, char in druge osnovne tipe, ki niso objekti) v vseh vrstah predlog, v operatorju „instanceof“ in v blokih „switch“. switch (x.getStatus()) { case 0 -> „v redu“; case 1 -> „opozorilo“; case 2 -> „napaka“; case int i -> „neznan status: “ + i; } if (i instanceof byte b) { … b … }
- Predlagana deveta preliminarna realizacija API Vector, ki zagotavlja funkcije za vektorske izračune, ki se izvajajo z uporabo vektorskih navodil procesorjev x86_64 in AArch64 ter omogočajo hkratno izvajanje operacij na več vrednostih (SIMD). V nasprotju z zmogljivostmi, ki jih nudi JIT-kompilator HotSpot za samodejno vektorizacijo skalarnih operacij, nov API omogoča izrecno upravljanje z vektorizacijo za paralelno obdelavo podatkov.
- Izvedena je podpora za sinhronizacijo virtualnih tokov brez njihovega povezovanja (pinning) s tokovi, povezanimi s platformo. Virtualni tokovi v sinhronizirani metodi ali izrazu v stanju blokade zdaj osvobodijo svoj platformni tok, kar omogoča drugim virtualnim tokovom, da ga uporabijo, kar znatno povečuje število razpoložljivih virtualnih tokov in izboljšuje skalabilnost aplikacij, ki uporabljajo večnitnost.
- Dodana je tretja predhodna različica funkcionalnosti, ki omogoča določanje v konstruktorjih izrazov pred klicem super(…), ki se uporablja za izrecen klic konstruktorja nadrazreda iz konstruktorja podrazreda, če ti izrazi ne sklicujejo na izdelani objekt iz konstruktorja. class Outer { void hello() { System.out.println("Hello"); } class Inner { Inner() { hello(); super(); } } }
- V orodju jlink je bila uvedena podpora za ustvarjanje run-time slik brez uporabe JMOD datotek, kar omogoča približno 25% zmanjšanje velikosti JDK.
- Dodana je bila druga predhodna različica uporabe enega izraza "import module M" za uvoz vseh paketov, ki jih izvaža navedeni modul. Sprememba bistveno poenostavi ponovno uporabo modulov, kar omogoča vključitev 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 prej bilo treba omenjati posebej ("import java.io.*", "import java.util.*" itd.).
- Dodana je četrta predhodna različica implicitno deklariranih razredov in anonimnih primerkov metode "main", ki ne zahtevajo deklaracije public/static, prenosa tabele argumentov in drugih elementov, povezanih z deklaracijo razreda. // bilo public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } // zdaj je mogoče void main() { System.out.println("Hello, World!"); }
- Predlagana je četrta predhodna različica API-ja za strukturirano sočasnost (Structured Concurrency), ki poenostavi razvoj večnitnih aplikacij z obdelavo več nalog, ki se izvajajo v različnih nitih, kot enotne enote.
- V API-ju KeyPairGenerator, Signature in KeyFactory je bila dodana podpora za algoritme ML-KEM (CRYSTALS-Kyber) in ML-DSA (CRYSTALS-Dilithium), standardizirane pri Nacionalnem inštitutu za standarde in tehnologijo ZDA (NIST) in odporne na napade s kvantnimi računalniki. Ti algoritmi uporabljajo metode kriptografije, ki temeljijo na reševanju problemov teorije rešetk, katerega čas rešitve se ne razlikuje na klasičnih in kvantnih računalnikih.
- V zbiralniku odpadkov ZGC je bila odstranjena podpora za ne-generativni način delovanja, ki ne ločuje med obdelavo 'starih' in 'mladih' objektov. Od Java SE 23 je generativni način ZGC privzeto uporabljen.
- Dodane so bile opozorila o uporabi API JNI (Java Native Interface) in FFM (Foreign Function & Memory) z namenom pripraviti razvijalce na omejitev dostopa do teh API-jev zaradi uvedbe načina zagotavljanja celovitosti, ki bo privzeto prepovedoval interakcijo z naravno kodo v eni izmed prihodnjih različic.
- Omogočeno je opozorilo pri uporabi metod dostopa do zunanjega pomnilnika (izven JVM), ki jih zagotavlja razred sun.misc.Unsafe. Za dostop do pomnilnika izven kupčka (off-heap) in interakcijo z zunanjo kodo se priporoča uporaba API VarHandle. V prejšnji različici je bila podpora za sun.misc.Unsafe razglašena za zastarelo.
- Onemogočen je bil Security Manager, ki je že dolgo izgubil pomen in ni bil več potreben po ukinitvi podpore za brskalniške razširitve. Security Manager je bil razglašen za zastarelega v Java 17. V eni izmed prihodnjih različic je načrtovano popolno odstranjevanje kode Security Managerja.
- Odstranjena je bila koda za podporo 32-bitni platformi operacijskega sistema Windows na sistemih x86. Java za 32-bitne sisteme x86 je bila razglašena za zastarelo in načrtovana za odstranitev (podpora za Linux na 32-bitnih sistemih x86 bo prekinjena).
Dodatno lahko omenimo objavo posodobitve platforme za ustvarjanje aplikacij z grafičnim vmesnikom JavaFX 24 in novo različico univerzalnega virtualnega stroja GraalVM, ki podpira zagon aplikacij v JavaScriptu (Node.js), Pythonu, Rubyu, R, vseh jezikih za JVM (Java, Scala, Clojure, Kotlin) ter jezikih, za katere je mogoče ustvariti bitcode LLVM (C, C++, Rust). Poleg podpore za JDK 24 so v novi različici GraalVM izvedene optimizacije za naloge, povezane z strojim učenjem, izboljšana podpora za prevajanje Java bytecode-a v strojno kodo, dodan je mehanizem SkipFlow za zmanjšanje velikosti izvršnih datotek in zmanjšanje časa prevajanja.
Izvor: opennet.ru
