Pas pas gjashtĂ« muaj zhvillimi, kompania Oracle publikoi platformĂ«n Java SE 24 (Java Platform, Standard Edition 24), e cila pĂ«rdor projektin e hapur OpenJDK si njĂ« implementim referimi. PĂ«rveç heqjes sĂ« disa aftĂ«sive tĂ« vjetra, Java SE 24 ruan pĂ«rputhshmĂ«rinĂ« me versionet e kaluara tĂ« platformĂ«s Java â shumica e projekteve Java tĂ« shkruara mĂ« parĂ« do tĂ« funksionojnĂ« pa ndryshime kur ekzekutohen nĂ« versionin e ri. NdĂ«rtimet e gatshme 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). Implementimi referues i Java SE 24, i zhvilluar brenda projektit OpenJDK, Ă«shtĂ«PlotĂ«sisht i hapur nĂ«n licencĂ«n GPLv2 me pĂ«rjashtime tĂ« GNU ClassPath, qĂ« lejojnĂ« lidhjen dinamike me produkte komerciale.
Java SE 24 i përket kategorisë së lëshimeve me mbështetje të zakonshme, përditësimet e të cilit do të lëshohen deri në lëshimin e ardhshëm. Si degë me mbështetje afatgjatë (LTS), duhet të përdoret Java SE 21 ose Java SE 17, përditësimet e të cilave do të lëshohen deri në vitet 2031 dhe 2029 përkatësisht (publike deri në vitet 2028 dhe 2026). Mbështetje e zgjeruar për degën LTS të Java SE 8 do të vazhdojë deri në vitin 2030, ndërsa Java SE 11 deri në vitin 2032. Lëshimi i ardhshëm LTS do të jetë lëshimi i vjeshtës Java SE 25.
Disa nga novitetet e propozuara në Java SE 24 janë:
- Një mod i ri eksperimental i gjenerimit në mbledhësin e plehrave Shenandoah është propozuar, në të cilin trajtohen veçmas objektet e vjetra dhe ato të sapokrijuara për të rritur efikasitetin e pastrimit të objekteve me kohë të shkurtër jetese. Ky mod i ri ofron kapacitete më të parashikueshme, qëndrim më të mirë ndaj ndryshimit të ngarkesës dhe ulje të konsumit të memories gjatë mbledhjes së plehrave. Planifikuesi Shenandoah synon të reduktojë kohën e ndalesave gjatë mbledhjes së plehrave, duke realizuar një sasi më të madhe pune paralelisht me ekzekutimin e aplikacioneve Java.
- Në JVM HotSpot është implementuar mbështetje eksperimentale për titujt e kompaktë të objekteve, të cilët në sisteme 64-bit kanë reduktuar madhësinë nga 96 në 64 bite (nga 12 në 8 byte). Reduktimi i madhësisë së titujve lejon tkurrjen e madhësisë së grumbullit dhe përmirësimin e efikasitetit të punës së caches.
- Në mbledhësin e mbeturinave G1, implementimi i barrierave për ndjekjen e qasjes së aplikacionit në memorie është thjeshtuar. Në versionin e ri, operacionet e zgjerimit të barrierave janë kaluar në një etapë më të vonshme të kompajlimit në C2 JIT. Testet e kryera tregojnë se një kalim i tillë lejon uljen e kostove të mbështetjes në JIT-kompiluesin C2 me 10-20% në varësi të aplikacionit.
- Shtuar API për përdorimin e funksioneve kriptografike për formimin e çelësave (KDF, funksioni i nxjerrjes së çelësit), të cilat lejojnë formimin e çelësave të tjerë me gjatësi të nevojshme mbi bazën e çelësit sekret (p.sh., fjalëkalimi) dhe një grup të njëkohshëm të dhënash. API KDF aktualisht ka statusin e paraqitjes (preview).
- Shtuar mundësia për ngarkimin dhe grupimin e klasave në parazgjedhje (Ahead-of-Time). Ky ndryshim lejon përshpejtimin e startit të HotSpot JVM duke ofruar klasat e zakonshme në gjendjen e ngarkuar dhe të grupuar tashmë. Gjatë startit të parë të aplikacionit, gjendja e të gjitha klasave ruhet në cache dhe në startet e mëpasshme përdoret për përshpejtimin e ngarkimit.
- Shtuar API Class-File për analizimin, gjenerimin dhe konvertimin e skedarëve të klasave 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); } } });
- Shtuar API të avancuar Stream, që mbështet definimin e operacioneve të ndërmjetme të personalizuara, të cilat mund të jenë të dobishme në raste kur operacionet e ndërmjetme të integruara ekzistuese nuk mjaftojnë për transformimin e dëshiruar të të dhënave. Trajtuesit e personalizuar lidhen përmes një operacioni të ri të ndërmjetëm Stream::gather(Gatherer), i cili përpunon elementet e stream-it, duke u aplikuar atyre trajtuesin 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]]
- ĂshtĂ« propozuar njĂ« zbatim i katĂ«rt preliminar i Vlerave tĂ« Kufizuara (Scoped Values), qĂ« lejojnĂ« ndarjen e tĂ« dhĂ«nave tĂ« pandryshueshme nĂ« fluksia dhe shkĂ«mbimin efektiv tĂ« tĂ« dhĂ«nave midis flukseve fĂ«mijĂ« (vlerat trashĂ«gohen). Vlerat e Kufizuara janĂ« duke u zhvilluar pĂ«r tĂ« zĂ«vendĂ«suar mekanizmin e variablave tĂ« brendshĂ«m tĂ« fluksit (thread-local variables) dhe janĂ« mĂ« efikase kur pĂ«rdoren shumĂ« flukse virtuale (mijĂ«ra dhe miliona flukse). Dallimi kryesor mes Vlerave tĂ« Kufizuara dhe variablave tĂ« brendshĂ«m tĂ« fluksit Ă«shtĂ« se tĂ« parat shkruhen njĂ« herĂ«, nuk mund tĂ« ndryshohen mĂ« dhe mbeten tĂ« aksesueshme vetĂ«m pĂ«r kohĂ«n e ekzekutimit tĂ« fluksit.
- Në mekanizmat e përputhjes me modelin është shtuar mbështetje preliminare për përdorimin e tipeve primitive (int, byte, char dhe tipe të tjera të bazuar, që nuk janë objekte) në të gjitha llojet e modeleve, në operatorin "instanceof" dhe në blloqet "switch". switch (x.getStatus()) { case 0 -> "okay"; case 1 -> "warning"; case 2 -> "error"; case int i -> "status i panjohur: " + i; } if (i instanceof byte b) { ⊠b ⊠}
- ĂshtĂ« propozuar njĂ« zbatim i nĂ«ntĂ« preliminar i API Vector, qĂ« ofron funksione pĂ«r llogaritjet vektorike, tĂ« cilat realizohen duke pĂ«rdorur instrukcionet vektoriale tĂ« procesorĂ«ve x86_64 dhe AArch64 dhe lejojnĂ« kryerjen e operacioneve nĂ« tĂ« njĂ«jtĂ«n kohĂ« pĂ«r disa vlera (SIMD). NĂ« dallim nga mundĂ«sitĂ« e ofruara nga kompilatori JIT HotSpot pĂ«r automatizimin e vektorizimit tĂ« operacioneve skalarĂ«, API i ri ofron mundĂ«sinĂ« pĂ«r tĂ« menaxhuar mĂ« qartĂ« vektorizimin pĂ«r pĂ«rpunimin paralel tĂ« tĂ« dhĂ«nave.
- ĂshtĂ« realizuar mbĂ«shtetje pĂ«r sinkronizimin e flukseveVirtuale pa i lidhur ato (pinning) me flukset e lidhura me platformĂ«n. Flukset virtuale nĂ« metodĂ«n apo shprehjen e sinkronizuar nĂ« gjendje bllokimi tani çlirojnĂ« fluksin e tyre tĂ« platformĂ«s, duke lejuar qĂ« flukset e tjera virtuale ta pĂ«rdorin atĂ«, duke rritur ndjeshĂ«m numrin e flukseve virtuale tĂ« disponueshĂ«m dhe duke pĂ«rmirĂ«suar shkallĂ«zimin e aplikacioneve qĂ« pĂ«rdorin multithread.
- A third preliminary option has been added for the capability that allows specifying expressions in constructors before calling super(âŠ), used for explicitly invoking the parent class constructor from the inherited class constructor, provided these expressions do not refer to the instance being created by the constructor. class Outer { void hello() { System.out.println("Hello"); } class Inner { Inner() { hello(); super(); } } }
- The jlink utility has implemented support for creating run-time images without using JMOD files, allowing a reduction in JDK size by approximately 25%.
- A second preliminary option for using a single expression "import module M" has been added to import all packages exported by the specified module at once. This change significantly simplifies the reuse of module libraries, allowing libraries and classes to be included without specifying their location in the package hierarchy. For example, specifying "import module java.base" will import all 54 packages contained in the java.base module, which would previously need to be mentioned separately ("import java.io.*", "import java.util.*", etc.).
- A fourth preliminary implementation of implicitly declared classes and anonymous instances of the method "main" has been added, where it is possible to do without public/static declarations, passing an array of arguments, and other entities associated with class declaration. // was public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } // now it's possible void main() { System.out.println("Hello, World!"); }
- A fourth preliminary version of the API for structured concurrency has been proposed for testing, simplifying the development of multi-threaded applications by handling multiple tasks performed in different threads as a single block.
- Support for the ML-KEM (CRYSTALS-Kyber) and ML-DSA (CRYSTALS-Dilithium) algorithms has been added to the KeyPairGenerator, Signature, and KeyFactory APIs, standardized by the U.S. National Institute of Standards and Technology (NIST) and resistant to quantum computer attacks. These algorithms use cryptography techniques based on solving lattice theory problems, the resolution time of which does not differ between classical and quantum computers.
- Në mbledhësin e mbeturinave ZGC është eliminuar mbështetje për modin jo-generativ të punës, që nuk ndan procesimin e objekteve "të vjetra" dhe "të reja". Duke filluar nga Java SE 23, moda generative e ZGC aplikohet si parazgjedhje.
- ĂshtĂ« shtuar njĂ« mesazh paralajmĂ«rues pĂ«r pĂ«rdorimin e API-sĂ« JNI (Java Native Interface) dhe FFM (Foreign Function & Memory) me qĂ«llim pĂ«rgatitjen e zhvilluesve pĂ«r kufizimin e aksesit nĂ« kĂ«to API pĂ«r shkak tĂ« pĂ«rfshirjes nĂ« njĂ« nga lĂ«shimet e ardhshme tĂ« njĂ« modeli qĂ« garanton integritetin, i cili ndalon njĂ«herĂ« e pĂ«rgjithmonĂ« ndĂ«rveprimin me kodin natyror.
- ĂshtĂ« aktivizuar njĂ« mesazh paralajmĂ«rues kur pĂ«rdoren metodat pĂ«r qasje nĂ« kujtesĂ«n jashtĂ« (jashtĂ« JVM), tĂ« ofruara nga klasa sun.misc.Unsafe. PĂ«r tĂ« accesuar kujtesĂ«n jashtĂ« heap-it dhe pĂ«r t'u ndĂ«rvepruar me kodin e jashtĂ«m, rekomandohet tĂ« pĂ«rdoret API VarHandle. NĂ« lĂ«shimin e kaluar, mbĂ«shtetja pĂ«r sun.misc.Unsafe u shpall e skaduar.
- Menaxheri i Sigurimit është çaktivizuar, i cili ka humbur rëndësinë e tij dhe është bërë i papërdorshëm pas ndalimit të mbështetjes për plug-in-e të shfletuesit. Menaxheri i Sigurimit u klasifikua si i skaduar në Java 17. Në një nga lëshimet e ardhshme, planifikohet të hiqet plotësisht kodi i Menaxherit të Sigurimit.
- Kodi për mbështetje të platformës 32-bit të sistemit operativ Windows në sistemet x86 është hequr. Porti i Java për sistemet 32-bit është shpallur i skaduar dhe është planifikuar për heqje (do të ndalojë mbështetjen për Linux në sistemet 32-bit x86).
Gjithashtu, mund të theksohet publikimi i përditësimit të platformës për krijimin e aplikacioneve me ndërfaqe grafike JavaFX 24 dhe lëshimi i ri i makinerisë universale GraalVM, e cila 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 makinerik, është përmirësuar mbështetja për kompilimin e kodit Java byte në kod makinerik, është shtuar mekanizmi SkipFlow për të reduktuar madhësinë e skedarëve ekzekutivë dhe për të zvogëluar kohën e kompilimit.
Burimi: opennet.ru
