Pas gjashtĂ« muajve zhvillimi, kompania Oracle publikoi platformĂ«n Java SE 25 (Java Platform, Standard Edition 24), pĂ«r tĂ« cilĂ«n Ă«shtĂ« pĂ«rdorur projekti i hapur OpenJDK si realizimi referues. PĂ«rveç eliminitimit tĂ« disa funksionaliteteve tĂ« vjetruara, Java SE 25 ruan pĂ«rputhshmĂ«rinĂ« prapa me versionet e mĂ«parshme tĂ« platformĂ«s Java â shumica e projekteve Java tĂ« shkruara mĂ« parĂ« do tĂ« funksionojnĂ« pa ndryshime kur ekzekutohen nĂ«n menaxhimin e versionit tĂ« ri. NdĂ«rtimet e gatshme pĂ«r instalim tĂ« Java SE 25 (JDK, JRE dhe Server JRE) janĂ« pĂ«rgatitur pĂ«r Linux (x86_64, AArch64), Windows (x86_64) dhe macOS (x86_64, AArch64). Realizimi referues i Java SE 25 i zhvilluar nĂ« kuadĂ«r tĂ« projektit OpenJDK Ă«shtĂ« plotĂ«sisht i hapur nĂ«n licencĂ«n GPLv2 me pĂ«rjashtime nga GNU ClassPath, tĂ« cilat lejojnĂ« lidhjen dinamike me produkte komerciale.
Java SE 25 Ă«shtĂ« klasifikuar si njĂ« lĂ«shim me mbĂ«shtetje tĂ« zgjeruar, pĂ«r tĂ« cilin pĂ«rditĂ«simet do tĂ« lĂ«shohen deri nĂ« vitin 2033 (pĂ«rditĂ«simet publike do tĂ« dalin deri nĂ« Shtator 2030). Si njĂ« degĂ« me mbĂ«shtetje tĂ« gjatĂ« (LTS), vazhdojnĂ« tĂ« mbĂ«shteten gjithashtu degĂ«t Java SE 17 dhe 21, pĂ«rditĂ«simet e sĂ« cilĂ«s do tĂ« lĂ«shohen deri nĂ« vitin 2029 dhe 2031, pĂ«rkatĂ«sisht (publike â deri nĂ« vitin 2026 dhe 2028). MbĂ«shtetja e zgjeruar pĂ«r degĂ«t LTS Java SE 8 dhe 11 do tĂ« vazhdojĂ« deri nĂ« vitin 2030 dhe 2032.
Ndër risitë e ofruara në Java SE 25 (1, 2, 3, 4):
- U shtua një API eksperimental StableValue për të punuar me objekte që përmbajnë të dhëna të pandryshueshme dhe që trajtohen në JVM si konstantë. Këtyre objekteve u aplikohen optimizime performancë, të ngjashme me fushat me fjalën kyçe "final". API StableValue ndan krijimin e vlerave të qëndrueshme dhe inicializimin e tyre, duke garantuar që vlera mund të inicializohet vetëm një herë, duke zvogëluar kohën e nisjes së programeve dhe duke lejuar aplikimin e optimizimeve të ngjeshjes së konstantave (constant-folding) në kodin e përdoruesit, të cilat më parë ishin përdorur vetëm në kodin e brendshëm të JDK. class Application { // Ishte: // static final UserService USERS = new UserService(); // Behet: static final StableValue USERS = StableValue.of(); public static UserService users() { return USERS.orElseSet(UserService::new); } }
- U shtua një API eksperimental për kodimin dhe dekodimin e objekteve me çelësa kriptografikë, certifikata dhe lista të revokuar të certifikatave, duke përdorur formatin PEM (Pivacy-Enhanced Mail).
- Shtuar mbështetje për Vlerat e kufizuara (Scoped Values), të cilat lejojnë ndarjen e të dhënave të pandryshueshme në flukset dhe shkëmbimin efektiv të të dhënave midis flukseve të fëmijës (vlerat trashëgohen). Vlerat e kufizuara po zhvillohen për të zëvendësuar mekanizmin e variablave lokale për rrjedhën (thread-local variables) dhe janë më efikase kur përdoren një numër shumë të madh të flukseve virtuale (mijëra dhe miliona flukse). Dallimi kryesor midis Vlerave të kufizuara dhe variablave lokalë për rrjedhën është se të parat shkruhen një herë, më pas nuk mund të ndryshohen dhe mbeten të aksesueshme vetëm gjatë kohëzgjatjes së ekzekutimit të rrjedhës.
- Shtuar API për përdorimin e funksioneve kriptografike të formimit të çelikut (KDF, key derivation function), të cilat lejojnë formimin e çelikut shtesë të nevojshëm të gjatë mbi bazën e çelikut sekret (p.sh., fjalëkalimit) dhe një grupe të dhënash të rastësishme.
- Eshirja e kodit dhe skenarët e ndërtimit për mbështetje të sistemeve 32-bit x86. Përcaktimi i mbështetjes për sistemet 32-bit x86 ka lejuar thjeshtimin e infrastrukturës për ndërtimin dhe testimin e JDK-së, si dhe ka lejuar zbatimin e karakteristikave që lidhen me platformat, pa krijuar menaxhuesit e rezervës për sistemet 32-bit x86.
- Shtuar mundësia për përdorimin e një shprehjeje "import module M" për të importuar menjëherë të gjitha paketat e eksportuara nga moduli i caktuar. Ky ndryshim thjeshton ndjeshëm rizhvillimin e bibliotekave modulare, duke lejuar lidhjen e biblioteka dhe klasave pa përcaktuar vendndodhjen e tyre në hierarkinë e paketave. Për shembull, tregimi "import module java.base" do të çojë në importimin e të gjitha 54 paketave që bëjnë pjesë në modul java.base, të cilat më parë do të ishin dashur të përmendeshin veçmas ("import java.io.*", "import java.util.*" etj.).
- I propozuar një variant kompakt të organizimit të programeve, i cili mund të jetë i dobishëm për mësim dhe ndërtimin e aplikacioneve të vogla. Në formën kompakte nuk kërkohet definimi i klasave shtesë, API-të tipike importohen automatikisht dhe metodat e thjeshta të hyrjes/daljes janë të disponueshme. Për shembull, aplikacioni 'Hello, World!' mund të reduktohet në: void main() { IO.println('Hello, World!'); }
- Lejohet tĂ« pĂ«rcaktohen shprehjet nĂ« konstruktorĂ«t pĂ«rpara thirrjes sĂ« super(âŠ), e cila pĂ«rdoret pĂ«r thirrjet e qarta tĂ« konstruktorit tĂ« klasĂ«s prind nga konstruktorĂ«t e klasĂ«s sĂ« trashĂ«guar, nĂ«se kĂ«to shprehje nuk referohen nĂ« instancĂ«n e krijuar nga konstruktori. class Outer { void hello() { System.out.println('Hello'); } class Inner { Inner() { hello(); super(); } } }
- U shtua një mënyrë gjeneruese për punën e grumbulluesit të mbeturinave Shenandoah, ku trajtohen veçmas objektet e vjetra dhe ato të krijuara së fundmi për të rritur efikasitetin e pastrimit të objekteve me kohë të shkurtër jetese. Mënyra e re siguron kapacitet më të parashikueshëm, qëndresë ndaj ndryshimeve të ngarkesës dhe ulje të konsumit të memories gjatë grumbullimit të mbeturinave. Planifikuesi Shenandoah synon të reduktojë kohën e ndalesave gjatë grumbullimit të mbeturinave duke kryer një sasi më të madhe punimesh paralelisht me ekzekutimin e aplikacioneve Java.
- Thjeshtuar krijimi i caches pĂ«r ngarkimin dhe kompozimin paraprak (Ahead-of-Time), duke mundĂ«suar njĂ« fillim mĂ« tĂ« shpejtĂ« tĂ« HotSpot JVM duke angazhuar klasat nĂ« njĂ« gjendje tĂ« ngarkuar dhe tĂ« kompozuar tashmĂ«. GjatĂ« ekzekutimit, tani nuk kĂ«rkohen operacione tĂ« ndara pĂ«r regjistrimin e aktiviteteve dhe krijimin e caches, dhe mjafton njĂ« komandĂ«: java -XX:AOTCacheOutput=app.aot -cp app.jar com.example.App âŠ
- Kur filloni HotSpot Java VM, është implementuar mundësia e përdorimit të profileve të ekzekutimit të metodave, të marra nga fillimi i kaluar i aplikacionit. Kjo ndryshim lejon që JIT kompileri të shmangë grumbullimin e statistikave dhe të fillojë menjëherë të gjenerojë kodin natyror pa pritur formimin e profilit.
- Në HotSpot JVM është implementuar mbështetje për tituj 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 tkurrjen e madhësisë së kupës dhe rrit eficiencën e punës së cache-it.
- ĂshtĂ« propozuar njĂ« implementim provues i API Vector, qĂ« ofron funksione pĂ«r llogaritjet vektoriale, tĂ« cilat kryhen duke pĂ«rdorur instrukcionet vektoriale tĂ« procesorĂ«ve x86_64 dhe AArch64 dhe lejojnĂ« aplikimin e operacioneve menjĂ«herĂ« nĂ« disa vlera (SIMD). NĂ« krahasim me mundĂ«sitĂ« e ofruara nga JIT kompileri HotSpot pĂ«r avtokompozimin e operacioneve skalarĂ«, API i ri jep mundĂ«sinĂ« pĂ«r tĂ« menaxhuar qartĂ« vektorizimin pĂ«r pĂ«rpunim paralel tĂ« tĂ« dhĂ«nave.
- Propozohet një variant i pestë paraprak i API për konvergencën e strukturuar (Structured Concurrency), e cila thjeshton zhvillimin e aplikacioneve me shumë procese përmes trajtimit të disa detyrave që kryhen në procese të ndryshme si një bllok të vetëm.
- Në mekanizmin e përputhjes me modelin, propozohet një variant i tretë paraprak për përdorimin e tipeve primitive (int, byte, char dhe tipet e tjera bazë që nuk janë objekte) në të gjitha llojet e shablloneve, në operatorin «instanceof» dhe në blloqet «switch». switch (x.getStatus()) { case 0 -> «mirë»; case 1 -> «këshillë»; case 2 -> «gabim»; case int i -> «status i panjohur: » + i; } if (i instanceof byte b) { ⊠b ⊠}
- Në JDK Flight Recorder (JFR) është shtuar mbështetje eksperimentale për profilimin me ndjekjen më të saktë të konsumit të burimeve CPU në platformën Linux. Informacioni në lidhje me kohën e ekzekutimit të konstruktimeve të ndryshme mund të visualizationohet në mënyrë të qartë duke përdorur diagrame të ngjyrës «FlameGraph».
- ĂshtĂ« rritur stabiliteti i funksionimit tĂ« JDK Flight Recorder (JFR) gjatĂ« sampimit asinkron tĂ« stekĂ«ve tĂ« proceseve Java pĂ«rmes kalimit pĂ«rmes stekĂ«ve tĂ« thirrjeve vetĂ«m nĂ« «pikat e sigurta» (safepoints).
- Në JDK Flight Recorder (JFR) janë shtuar mjete për gjurmimin dhe vlerësimin e kohës së ekzekutimit të metodave. Përkrahet gjurmimi i stack-it të thirrjeve të metodave specifike dhe regjistrimi i statistikave precize mbi thirrjet e metodave, duke përfshirë metrika si koha e ekzekutimit dhe numri i thirrjeve.
Burimi: opennet.ru
