Pas gjashtĂ« muajsh zhvillimi, kompania Oracle publikoi platformĂ«n Java SE 24 (Java Platform, Standard Edition 24), pĂ«r tĂ« cilĂ«n pĂ«rdoret projekti i hapur OpenJDK si realizimi standard. PĂ«rveç eliminimit tĂ« disa mundĂ«sive tĂ« vjetra, Java SE 24 ruan pĂ«rputhshmĂ«rinĂ« e prapambetur me lĂ«shimet e mĂ«parshme tĂ« platformĂ«s Java â shumica e projekteve tĂ« shkruara mĂ« parĂ« nĂ« Java do tĂ« funksionojnĂ« pa ndryshime kur ekzekutohen nĂ«n menaxhimin e versionit tĂ« ri. Blerjet gati pĂ«r instalim tĂ« Java SE 24 (JDK, JRE dhe Server JRE) janĂ« pĂ«rgatitur pĂ«r Linux (x86_64, AArch64), Windows (x86_64) dhe macOS (x86_64, AArch64). Realizimi standard i Java SE 24, i zhvilluar nĂ« kuadĂ«r tĂ« projektit OpenJDK, Ă«shtĂ« plotĂ«sisht i hapur nĂ«n licencĂ«n GPLv2 me pĂ«rjashtime nga GNU ClassPath, qĂ« lejojnĂ« lidhjen dinamike me produktet komerciale.
Java SE 24 Ă«shtĂ« klasifikuar si njĂ« version me mbĂ«shtetje tĂ« zakonshme, me pĂ«rmirĂ«sime qĂ« do tĂ« lĂ«shohen deri nĂ« versionin e ardhshĂ«m. Si njĂ« degĂ« me mbĂ«shtetje afatgjatĂ« (LTS), duhet pĂ«rdorur Java SE 21 ose Java SE 17, pĂ«rmirĂ«simet e tĂ« cilave do tĂ« lĂ«shohen deri nĂ« vitet 2031 dhe 2029 pĂ«rkatĂ«sisht (publik â deri nĂ« vitet 2028 dhe 2026). MbĂ«shtetje e zgjeruar pĂ«r degĂ«n LTS tĂ« Java SE 8 do tĂ« zgjasĂ« deri nĂ« vitin 2030, ndĂ«rsa Java SE 11 deri nĂ« vitin 2032. LĂ«shimi i ardhshĂ«m LTS do tĂ« jetĂ« lĂ«shimi vjeshtor i Java SE 25.
Mes risive të paraqitura në Java SE 24 janë:
- ĂshtĂ« propozuar njĂ« modalitet eksperimental i punĂ«s sĂ« mbledhĂ«sit tĂ« mbeturinave Shenandoah, ku trajtohen veçmas objektet e vjetra dhe ato tĂ« sapo krijuara pĂ«r tĂ« rritur efikasitetin e pastrimit tĂ« objekteve me kohĂ« tĂ« shkurtĂ«r jete. Ky modalitet siguron njĂ« kapacitet mĂ« tĂ« parashikueshĂ«m, qĂ«ndrueshmĂ«ri ndaj ndryshimeve tĂ« ngarkesĂ«s dhe njĂ« ulje tĂ« konsumit tĂ« memories gjatĂ« mbledhjes sĂ« mbeturinave. Planifikuesi Shenandoah Ă«shtĂ« nĂ« fokus tĂ« reduktimit tĂ« kohĂ«ve tĂ« ndalesave gjatĂ« mbledhjes sĂ« mbeturinave pĂ«rmes kryerjes sĂ« njĂ« sasie mĂ« tĂ« madhe pune paralelisht me ekzekutimin e aplikacioneve Java.
- Në HotSpot JVM, është implementuar mbështetje eksperimentale për titujt kompaktë të objekteve, të cilët në sistemet 64-bit janë reduktuar nga 96 në 64 bit (nga 12 në 8 byte). Reduktimi i madhësisë së titujve lejon zvogëlimin e madhësisë së grumbullit dhe rritjen e efikasitetit të punës së caches.
- Në mbledhësin e mbetjeve G1, janë thjeshtuar implementimet e barrierave që ndjekin qasjen e aplikacionit në memorie. Në versionin e ri, operacionet e zgjerimit të barrierave janë kaluar në një fazë më të vonë të përpunimit në C2 JIT. Testet e kryera tregojnë se një kalim i tillë lejon një reduktim të kostove të JIT-kompilatorit C2 prej 10-20% në varësi të aplikacionit.
- ĂshtĂ« shtuar API pĂ«r pĂ«rdorimin e funksioneve kriptografike tĂ« formimit tĂ« çelĂ«sit (KDF, funksioni i derivatĂ«s sĂ« çelĂ«sit), tĂ« cilat lejojnĂ« formimin e çelĂ«save shtesĂ« me gjatĂ«si tĂ« nevojshme mbi bazĂ«n e çelĂ«sit sekret (p.sh., fjalĂ«kalimit) dhe njĂ« grumbulli tĂ« rastĂ«sishĂ«m tĂ« tĂ« dhĂ«nave. API KDF aktualisht ka statusin paraprak.
- Shtuar mundësia e ngarkimit dhe kompozimit të klasave në mënyrë të parashikuar (Ahead-of-Time). Kjo ndryshim lejon të përshpejtojë ngjalljen e HotSpot JVM duke siguruar klasat që përdoren në aplikacion në një gjendje të ngarkuar dhe të kompozuar. Gjatë ngjitjes së parë të aplikacionit, gjendja e të gjitha klasave ruhet në cache dhe gjatë ngjitjeve të mëvonshme përdoret për të përshpejtuar ngarkimin.
- Shtuar API Class-File për të analizuar, gjeneruar dhe trasformuar skedarët me klasat 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); } } });
- Shtesa e API Stream të avancuar, e cila mbështet përcaktimin e operacioneve ndërmjetëse të personalizuara, të cilat mund të jenë të dobishme në raste kur operacionet ndërmjetëse ekzistuese të ndërtuara nuk janë të mjaftueshme për transformimin e dëshiruar të të dhënave. Menaxherët e personalizuar lidhen përmes operacionit të ri ndërmjetës Stream::gather(Gatherer), i cili proceson elementet e rrjedhës duke iu aplikuar menaxherin e caktuar nga përdoruesi. 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]]
- Kjo është realizimi i katërt paraprak i vlerave të kufizuara (Scoped Values), të cilat lejojnë ndarjen e të dhënave të pandryshueshme në rrjedha dhe shkëmbimin e efikas të të dhënave midis nën-rrjedhave (vlerat trashëgohen). Vlerat e kufizuara po zhvillohen si një zëvendësim për mekanizmin e variablave lokalë të rrjedhës (thread-local variables) dhe janë më efikase kur përdoren një numër shumë të madh të rrjedhave virtuale (mijëra e miliona rrjedha). Dallimi kryesor mes vlerave të kufizuara dhe variablave lokalë të rrjedhës është se të parat shkruhen një herë, nuk mund të ndryshohen më vonë dhe mbeten të aksesueshme vetëm në kohën e ekzekutimit të rrjedhës.
- Në mekanizmat e përputhjes janë shtuar mbështetje paraprake për përdorimin e tipeve primitive (int, byte, char dhe tipe të tjera bazike që nuk janë objekte) në të gjitha llojet e shablloneve, në operatorin «instanceof» dhe në blloqet «switch». switch (x.getStatus()) { case 0 -> «okay»; case 1 -> «warning»; case 2 -> «error»; case int i -> «unknown status: » + i; } if (i instanceof byte b) { ⊠b ⊠}
- U ofruar implementimi i nëntë të paracaktuar i API Vector, i cili ofron funksionalitete për llogaritjet vektorike, të cilat kryhen duke përdorur udhëzimet vektorike të procesorëve x86_64 dhe AArch64 dhe lejojnë aplikimin e operacioneve në të njëjtën kohë në shumë vlera (SIMD). Ndryshe nga mundësitë e ofruara nga kompilatori JIT HotSpot për avoketizimin automatik të operacioneve skalar, API i ri ofron mundësinë për të menaxhuar drejtpërdrejt vektorizimin për përpunimin paralel të të dhënave.
- ĂshtĂ« implementuar mbĂ«shtetje pĂ«r sinkronizimin e rrjedhave virtuale pa i lidhur ato (pinning) me rrjedhat e lidhura me platformĂ«n. Rrjedhat virtuale nĂ« metodĂ«n ose shprehjen e sinkronizuar nĂ« gjendje bllokimi tani lirojnĂ« rrjedhĂ«n e tyre tĂ« platformĂ«s, duke lejuar qĂ« rrjedhat e tjera virtuale ta pĂ«rdorin atĂ«, gjĂ« qĂ« rrit ndjeshĂ«m numrin e rrjedhave virtuale tĂ« disponueshme dhe pĂ«rmirĂ«son shkallĂ«zimin e aplikacioneve qĂ« pĂ«rdorin multithreading.
- Shtuar varianti i tretĂ« paraprak i mundĂ«sive, qĂ« lejon specifikimin e shprehjeve nĂ« ndihmĂ«sit para thirrjes super(âŠ), e pĂ«rdorur pĂ«r thirrjen e qartĂ« tĂ« ndihmĂ«sit tĂ« klasĂ«s prind nga ndihmĂ«si i klasĂ«s sĂ« trashĂ«guar, nĂ«se kĂ«to shprehje nuk i referohen instancĂ«s sĂ« ndihmĂ«sit tĂ« krijuar nga ndihmĂ«sit. class Outer { void hello() { System.out.println("Hello"); } class Inner { Inner() { hello(); super(); } } }
- Në utilitarin jlink është realizuar mbështetje për krijimin e imazheve run-time pa përdorimin e skedave JMOD, që lejon reduktimin e madhësisë së JDK-së për rreth 25%.
- Shtuar varianti i dytë paraprak për përdorimin e një shprehjeje "import module M" për të importuar menjëherë të gjithë paketat e eksportuara nga moduli i specifikuar. Ky ndryshim e thjeshton ndjeshëm ripërdorimin e bibliotikave modulare, duke lejuar lidhjen e bibliotikave dhe klasave pa përcaktimin e vendit të tyre në hierarkinë e paketave. Për shembull, specifikimi i "import module java.base" do të çojë në importimin e të gjitha 54 paketave që përfshihen në modul java.base, të cilat më parë do të duhej të përmendeshin veçmas ("import java.io.*", "import java.util.*", etj.).
- E implementuar versionin e katërt të paracaktuar të klasave të shpallura në mënyrë të fshehtë dhe instanceve pa emër të metodës «main», në të cilat mund të kaloni pa shpallje public/static, kalimin e një vargu argumentesh dhe entitete të tjera që lidhen me shpalljen e klasës. // ishte public class HelloWorld { public static void main(String[] args) { System.out.println(«Hello world!»); } } // tani mund të jetë void main() { System.out.println(«Hello, World!»); }
- Propozuar për testim është varianti i katërt i paracaktuar i API për parametrizimin e strukturuar (Structured Concurrency), që thjeshton zhvillimin e aplikacioneve me shumë thread duke trajtuar disa detyra që ekzekutohen në thread të ndryshme si një bllok të vetëm.
- Në API KeyPairGenerator, Signature dhe KeyFactory është shtuar mbështetje për algoritmet ML-KEM (CRYSTALS-Kyber) dhe ML-DSA (CRYSTALS-Dilithium), të standardizuara nga Instituti Kombëtar i Standardeve dhe Teknologjive të SHBA (NIST) dhe të qëndrueshme ndaj provimeve në kompjuterët kuantikë. Këta algoritme përdorin metoda kriptografike të bazuara në zgjidhjen e problemeve të teorisë së rrjetave, koha e zgjidhjes së të cilave nuk ndryshon në kompjuterët zakonshëm dhe kuantikë.
- Në mbledhësin e mbetjeve ZGC, mbështetja për modin jo-gjenerues, i cili nuk ndan përpunimin e objekteve "të vjetra" dhe "të reja", është hequr. Duke filluar nga Java SE 23, moda gjeneruese ZGC aplikohet si parazgjedhje.
- Shtuar është dalja e paralajmërimeve për përdorimin e API JNI (Java Native Interface) dhe FFM (Foreign Function & Memory) me synimin për të përgatitur zhvilluesit për kufizimin e aksesit në këto API për shkak të përfshirjes në një nga lëshimet e ardhshme të modit të sigurisë, i cili me parazgjedhje ndalon ndërveprimin me kodin natyror.
- është përfshirë dalja e një paralajmërimi kur përdoren metodat e qasjes në kujtesë të jashtme (jashtë JVM), të ofruara nga klasa sun.misc.Unsafe. Për qasjen në kujtesën jashtë heap-it dhe ndërlidhjen me kodin e jashtëm rekomandohet përdorimi i API VarHandle. Në lëshimin e kaluar, mbështetja për sun.misc.Unsafe u shpall e vjetëruar.
- Menaxheri i Sigurisë është çaktivizuar, i cili ka humbur relevancë dhe është bërë i papërdorshëm pas ndërprerjes së mbështetjes për plugin-in e shfletuesit. Menaxheri i Sigurisë është klasifikuar si i vjetëruar në Java 17. Në një nga lëshimet e ardhshme planifikohet të hiqet plotësisht kodi i Menaxherit të Sigurisë.
- Kodi i mbĂ«shtetjes pĂ«r platformĂ«n 32-bit tĂ« sistemit operativ Windows nĂ« sistemet x86 Ă«shtĂ« fshirĂ«. ĂshtĂ« shpallur i vjetruar dhe Ă«shtĂ« planifikuar pĂ«r t'u fshirĂ« porti Java pĂ«r sistemet 32-bit x86 (do tĂ« ndĂ«rpritet mbĂ«shtetja pĂ«r Linux nĂ« sistemet 32-bit x86).
Gjithashtu, mund të theksohet publikimi i azhurnimit të platformës për krijimin e aplikacioneve me ndërfaqe grafike JavaFX 24 dhe versioni i ri i makinerisë virtuale universale GraalVM, që mbështet ekzekutimin e aplikacioneve në JavaScript (Node.js), Python, Ruby, R, çdo gjuhë për JVM (Java, Scala, Clojure, Kotlin) dhe gjuhë për të cilat mund të formohet bitcode LLVM (C, C++, Rust). Përveç mbështetjes për JDK 24, në versionin e ri të GraalVM janë bërë optimizime për detyra të lidhura me mësimin e makinave, është përmirësuar mbështetja për kompilimin e kodit Java-byte në kodin makina, është shtuar mekanizmi SkipFlow për të skaluar madhësinë e skedarëve ekzekutues dhe për të reduktuar kohën e kompilimit.
Burimi: opennet.ru
