După șase luni de dezvoltare, compania Oracle a publicat platforma Java SE 24 (Java Platform, Standard Edition 24), pentru care se folosește proiectul deschis OpenJDK ca implementare de referință. Cu excepția eliminării unor funcționalități învechite, Java SE 24 păstrează compatibilitatea inversă cu versiunile anterioare ale platformei Java — majoritatea proiectelor Java deja scrise vor funcționa fără modificări pe noua versiune. Pachetele pregătite pentru instalare Java SE 24 (JDK, JRE și Server JRE) sunt disponibile pentru Linux (x86_64, AArch64), Windows (x86_64) și macOS (x86_64, AArch64). Implementarea de referință a Java SE 24, dezvoltată în cadrul proiectului OpenJDK, este complet deschisă sub licența GPLv2 cu excepțiile GNU ClassPath, care permit legarea dinamică cu produse comerciale.
Java SE 24 este clasificat ca o versiune cu termen obișnuit de suport, actualizările pentru care vor fi lansate până la următoarea versiune. Pentru o ramură cu termen lung de suport (LTS) ar trebui utilizată Java SE 21 sau Java SE 17, actualizările pentru care vor fi lansate până în 2031 și 2029, respectiv (cele publice — până în 2028 și 2026). Suportul extins pentru ramura LTS Java SE 8 va continua până în 2030, iar Java SE 11 — până în 2032. Următoarea versiune LTS va fi lansarea din toamnă, Java SE 25.
Printre noutățile aduse de Java SE 24 se numără:
- A fost propus un mod experimental generativ de funcționare a colectorului de gunoi Shenandoah, în care obiectele vechi și cele recent create sunt procesate separat pentru a îmbunătăți eficiența curățării obiectelor cu o durată de viață scurtă. Noua modalitate oferă o lățime de bandă mai previzibilă, rezistență la schimbările de sarcină și o reducere a consumului de memorie în timpul colectării gunoiului. Schedulerul Shenandoah are ca obiectiv reducerea timpului de oprire în timpul colectării gunoiului prin desfășurarea unui volum mai mare de lucrări în paralel cu execuția aplicațiilor Java.
- În JVM HotSpot a fost implementat un suport experimental pentru anteturile compacte ale obiectelor, a căror dimensiune pe sistemele de 64 de biți a fost redusă de la 96 la 64 de biți (de la 12 la 8 octeți). Reducerea dimensiunii antetelor permite micșorarea dimensiunii heap-ului și îmbunătățirea eficienței funcționării cache-ului.
- În colectorul de gunoi G1, implementarea barierelor care monitorizează accesul aplicației la memorie a fost simplificată. În noua versiune, operațiunile de extindere a barierelor au fost mutate într-o etapă ulterioară a compilării în JIT-ul C2. Testele efectuate arată că această mutare permite o reducere a costurilor în JIT-ul C2 cu 10-20%, în funcție de aplicație.
- A fost adăugat un API pentru utilizarea funcțiilor criptografice de derivare a cheilor (KDF, key derivation function), care permit generarea de chei suplimentare de lungimea necesară pe baza unei chei secrete (de exemplu, o parolă) și a unui set de date arbitrar. API-ul KDF are în prezent statut de previzualizare (preview).
- A fost adăugată posibilitatea de încărcare și compunere anticipată (Ahead-of-Time) a claselor. Această schimbare permite accelerarea pornirii HotSpot JVM prin oferirea claselor utilizate în aplicație într-o stare deja încărcată și compusă. În timpul primei porniri a aplicației, starea tuturor claselor este stocată în cache și utilizată pentru accelerarea încărcării la pornirile ulterioare.
- A fost adăugat API-ul Class-File pentru analiza, generarea și transformarea fișierelor cu clase 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); } } });
- A fost adăugat un API extins pentru Stream, care suține definirea propriilor operațiuni intermediare, utile în cazurile în care operațiunile intermediare încorporate existente nu sunt suficiente pentru transformarea dorită a datelor. Manipulatoarele personalizate pot fi conectate prin intermediul unei noi operațiuni intermediare Stream::gather(Gatherer), care prelucrează elementele fluxului aplicându-le un manipulátor definit de utilizator. 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]]
- A fost propusă a patra implementare preliminară a valorilor limitate (Scoped Values), care permite partajarea datelor imuabile între fluxuri și schimbul eficient de date între fluxurile secundare (valorile sunt moștenite). Valorile Scoped se dezvoltă pentru a înlocui mecanismul variabilelor locale de flux (thread-local variables) și sunt mai eficiente atunci când se utilizează un număr foarte mare de fluxuri virtuale (mii și milioane de fluxuri). Principala diferență între valorile Scoped și variabilele locale de flux este că primele sunt scrise o singură dată, ulterior nu pot fi modificate și rămân disponibile doar pe durata de execuție a fluxului.
- Mecanismele de potrivire s-au extins pentru a adăuga suport preliminar pentru utilizarea tipurilor primitive (int, byte, char și alte tipuri de bază, care nu sunt obiecte) în toate tipurile de șabloane, în operatorul „instanceof” și în blocurile „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 … }
- A fost propusă a noua implementare preliminară a API Vector, care oferă funcții pentru calculul vectorial, care se execută folosind instrucțiuni vectoriale ale procesoarelor x86_64 și AArch64 și permit aplicarea simultană a operațiunilor la mai multe valori (SIMD). Spre deosebire de capacitățile de auto-vectorizare a operațiunilor scalare oferite de compilatorul JIT HotSpot, noul API oferă posibilitatea de a gestiona explicit vectorizarea pentru prelucrarea paralelelă a datelor.
- A fost implementat suportul pentru sincronizarea fluxurilor virtuale fără a le atașa (pinning) la fluxurile legate de platformă. Fluxurile virtuale într-o metodă sau expresie sincronizată în stare de blocare eliberează acum fluxul lor de platformă, permițând altor fluxuri virtuale să îl utilizeze, ceea ce crește semnificativ numărul de fluxuri virtuale disponibile și îmbunătățește scalabilitatea aplicațiilor care utilizează multithreading.
- A fost adăugată a treia variantă preliminară a funcționalității ce permite specificarea în constructorii de expresii înainte de apelul super(…), utilizat pentru a apela explicit constructorul clasei părinte din constructorul clasei derivate, dacă aceste expresii nu fac referire la instanța creată de constructor. class Outer { void hello() { System.out.println("Hello"); } class Inner { Inner() { hello(); super(); } } }
- Utilitarul jlink a implementat suport pentru crearea imaginilor de run-time fără utilizarea fișierelor JMOD, ceea ce permite o reducere de aproximativ 25% a dimensiunii JDK.
- A fost adăugată a doua variantă preliminară a utilizării expresiei „import module M” pentru a importa toate pachetele exportate de modulul specificat. Această modificare simplifică semnificativ reutilizarea bibliotecilor modulare, permițând conectarea bibliotecilor și claselor fără a defini locația lor în ierarhia pachetelor. De exemplu, specificarea „import module java.base” va importa toate cele 54 de pachete incluse în modulul java.base, care anterior ar fi trebuit menționate individual („import java.io.*”, „import java.util.*” și așa mai departe).
- A fost adăugată a patra implementare preliminară a claselor declarate implicit și a instanțelor anonime ale metodei „main”, în care se poate renunța la declarațiile public/static, la transmiterea unui tablou de argumente și la alte entități legate de declarația clasei. // înainte public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } // acum se poate void main() { System.out.println("Hello, World!"); }
- A fost propus pentru testare al patrulea variantă preliminară a API-ului pentru concurența structurată (Structured Concurrency), care simplifică dezvoltarea aplicațiilor multi-thread prin tratarea mai multor sarcini executate în fire diferite ca un singur bloc.
- În API-ul KeyPairGenerator, Signature și KeyFactory a fost adăugat suport pentru algoritmii ML-KEM (CRYSTALS-Kyber) și ML-DSA (CRYSTALS-Dilithium), standardizați de Institutul Național de Standarde și Tehnologie din SUA (NIST) și rezistenți la atacuri cu computere cuantice. Acești algoritmi utilizează metode de criptografie bazate pe soluționarea problemelor din teoria rețelelor, timpul de soluționare a căror nu diferă pe computerele obișnuite și cuantice.
- În colectorul de gunoi ZGC a fost eliminată suportul pentru modul de operare non-generativ, care nu separa procesarea obiectelor „vechi” și „tineri”. Începând cu Java SE 23, modul generativ ZGC este aplicat implicit.
- Au fost adăugate avertizări privind utilizarea API-ului JNI (Java Native Interface) și FFM (Foreign Function & Memory) cu scopul de a pregăti dezvoltatorii pentru restricționarea accesului la aceste API-uri datorită implementării în una dintre viitoarele versiuni a unui mod de asigurare a integrității, care, implicit, interzice interacțiunea cu codul nativ.
- A fost activată afişarea unui avertisment la utilizarea metodelor de acces la memoria externă (în afara JVM), oferite de clasa sun.misc.Unsafe. Pentru accesul la memoria off-heap și interacțiunea cu codul extern, se recomandă utilizarea API-ului VarHandle. În versiunea anterioară, suportul pentru sun.misc.Unsafe a fost declarat învechit.
- A fost dezactivat Managerul de Securitate, care a devenit irelevant și a rămas neutilizat după ce suportul pentru plugin-ul din browser a fost oprit. Managerul de Securitate a fost clasat ca învechit în Java 17 și în una dintre următoarele versiuni se preconizează eliminarea completă a codului acestuia.
- A fost eliminat codul pentru suportul platformelor de 32 de biți pe sistemele de operare Windows x86. A fost declarat învechit și planificat pentru eliminare portul Java pentru sistemele de 32 de biți x86 (suportul pentru Linux pe sistemele x86 de 32 de biți va fi oprit).
Se poate menționa, de asemenea, publicarea unei actualizări a platformei pentru crearea aplicațiilor cu interfață grafică JavaFX 24 și o nouă versiune a mașinii virtuale universale GraalVM, care suportă rularea aplicațiilor în JavaScript (Node.js), Python, Ruby, R, orice limbaje pentru JVM (Java, Scala, Clojure, Kotlin) și limbaje pentru care poate fi generat cod bitcode LLVM (C, C++, Rust). Pe lângă suportul pentru JDK 24, noua versiune GraalVM a adus optimizări pentru sarcini legate de învățarea automată, îmbunătățind suportul pentru compilarea bytecode-ului Java în cod mașină, fiind adăugat mecanismul SkipFlow pentru reducerea dimensiunii fișierelor executabile și scurtarea timpului de compilare.
Sursa: opennet.ro
