Efter sex mĂ„naders utveckling har Oracle publicerat Java SE 24 (Java Platform, Standard Edition 24), vars referensimplementation anvĂ€nder det öppna projektet OpenJDK. Med undantag för att vissa förĂ„ldrade funktioner har tagits bort, bibehĂ„ller Java SE 24 bakĂ„tkompatibilitet med tidigare versioner av Java-plattformen â de flesta tidigare skrivna Java-projekt kommer att fungera utan förĂ€ndringar pĂ„ den nya versionen. InstallationsfĂ€rdiga paket för Java SE 24 (JDK, JRE och Server JRE) har förberetts för Linux (x86_64, AArch64), Windows (x86_64) och macOS (x86_64, AArch64). Den referensimplementation som utvecklats inom ramen för OpenJDK-projektet Ă€r helt öppen under GPLv2-licensen med undantag för GNU ClassPath, vilket möjliggör dynamisk lĂ€nkning med kommersiella produkter.
Java SE 24 klassificeras som en release med vanlig support, med uppdateringar som kommer att ges ut fram till nÀsta release. För lÄngsiktig support (LTS) bör Java SE 21 eller Java SE 17 anvÀndas, med uppdateringar fram till 2031 respektive 2029 (offentliga uppdateringar till 2028 och 2026). Den utökade stödet för LTS-grenen Java SE 8 kommer att fortsÀtta till 2030, medan Java SE 11 kommer att stödjas fram till 2032. Den nÀsta LTS-releasen blir höstreleasen Java SE 25.
Bland nyheterna i Java SE 24:
- En experimentell generativ arbetslÀge för garbage collector Shenandoah har föreslagits, dÀr gamla och nyligen skapade objekt behandlas separat för att öka effektiviteten i rena objekts livslÀngd. Det nya lÀget ger mer förutsÀgbar genomströmning, motstÄndskraft mot Àndringar i belastning och minskat minnesförbrukning vid garbage collection. Shenandoah-schemalÀggaren syftar till att minska stoppstid under garbage collection genom att utföra mer arbete parallellt med körande Java-applikationer.
- I HotSpot JVM har experimentellt stöd för kompakta objektheaderar implementerats, vars storlek pÄ 64-bitarsystem har minskats frÄn 96 till 64 bitar (frÄn 12 till 8 byte). Minskningen av headerstorleken möjliggör en minskning av heapstorleken och ökar cacheeffektiviteten.
- I G1-garbage collector har implementeringen av barriÀrer, som spÄrar applikationens Ätkomst till minnet, förenklats. I den nya versionen har operationerna för att expandera barriÀrer flyttats till ett senare skede av kompileringen i C2 JIT. Genomförda tester visar att en sÄdan flytt kan minska overheadkostnaderna i C2 JIT-kompilatorn med 10-20% beroende pÄ applikationen.
- Ett API för anvÀndning av kryptografiska funktioner för nyckelbildning (KDF, key derivation function) har lagts till, vilket möjliggör skapande av ytterligare nycklar av nödvÀndig lÀngd baserat pÄ en hemlig nyckel (till exempel ett lösenord) och en godtycklig uppsÀttning data. KDF API har för nÀrvarande status som förhandsvisning (preview).
- Möjligheten för förhandsvisning (Ahead-of-Time) av klassladdning och kompilering har lagts till. Denna Àndring gör det möjligt att snabba upp starten av HotSpot JVM genom att tillhandahÄlla klasser som anvÀnds i applikationen i redan laddat och kompilationslÀge. Vid första starten av applikationen ÄterstÀlls tillstÄndet för alla klasser till cachen och anvÀnds för att pÄskynda uppladdningen vid följande körningar.
- API:t Class-File har lagts till för analys, generering och omvandling av Java-klassfiler.
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); } } });
- Ett utökat API Stream har lagts till, som stödjer definiering av egna mellanoperationer som kan vara anvÀndbara nÀr de befintliga inbyggda mellanoperationerna inte rÀcker för önskad datatransformation. Egna hanterare ansluts via den nya mellanoperationen Stream::gather(Gatherer), som hanterar strömelement genom att tillÀmpa en anvÀndardefinierad hanterare. 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]]
- Den fjÀrde preliminÀra implementationen av Scoped Values har föreslagits, vilket möjliggör gemensam anvÀndning av oförÀnderliga data i trÄdar och effektiv datautbyte mellan undertrÄdar (vÀrden Àrvs). Scoped Values utvecklas för att ersÀtta mekanismen för trÄdspecifika variabler och Àr mer effektiva vid anvÀndning av ett mycket stort antal virtuella trÄdar (tusentals och miljontals trÄdar). Den huvudsakliga skillnaden mellan Scoped Values och trÄdspecifika variabler Àr att de förstnÀmnda skrivs en gÄng, kan sedan inte Àndras och förblir tillgÀngliga endast under körning av trÄden.
- PreliminÀr stöd för anvÀndning av primitiva typer (int, byte, char och andra grundlÀggande typer som inte Àr objekt) i alla typer av mallar, i operatorn 'instanceof' och i 'switch' block har lagts till mönstermatchningsmekanismen. switch (x.getStatus()) { case 0 -> "okay"; case 1 -> "warning"; case 2 -> "error"; case int i -> "unknown status: " + i; } if (i instanceof byte b) { ⊠b ⊠}
- Den nionde preliminÀra implementationen av API Vector har föreslagits, vilket erbjuder funktioner för vektorberÀkningar som utförs med hjÀlp av vektor instruktioner pÄ processorer x86_64 och AArch64 och möjliggör samtidig tillÀmpning av operationer pÄ flera vÀrden (SIMD). Till skillnad frÄn de funktioner för automatisk vektorisering av skalÀra operationer som erbjuds av JIT-kompilatorn HotSpot, ger det nya API:et möjlighet att explicit styra vektoriseringen för parallell databehandling.
- Stöd för synkronisering av virtuella trÄdar utan att de knyts (pinning) till plattformsrelaterade trÄdar har implementerats. Virtuella trÄdar i en synkroniserad metod eller uttryck i ett blockerat tillstÄnd frigör nu sin plattformstrÄd, vilket möjliggör för andra virtuella trÄdar att anvÀnda den, vilket avsevÀrt ökar antalet tillgÀngliga virtuella trÄdar och förbÀttrar skalbarheten hos applikationer som anvÀnder multitrÄdning.
- En tredje preliminĂ€r version av möjligheten har lagts till, som tillĂ„ter att ange uttryck i konstruktörer före anropet till super(âŠ), som anvĂ€nds för att uttryckligt anropa konstruktören av den överordnade klassen frĂ„n konstruktören av den Ă€rvda klassen, om dessa uttryck inte refererar till den instans som skapas av konstruktören. class Outer { void hello() { System.out.println("Hello"); } class Inner { Inner() { hello(); super(); } } }
- I verktyget jlink har stöd för att skapa körningstider utan att anvÀnda JMOD-filer implementerats, vilket gör att storleken pÄ JDK kan minskas med cirka 25%.
- En andra preliminÀr version av uttrycket "import module M" har lagts till för att importera alla paket som exporteras av den angivna modulen. FörÀndringen förenklar vÀsentligt ÄteranvÀndningen av modulbibliotek genom att tillÄta koppling av bibliotek och klasser utan att definiera deras plats i paketets hierarki. Till exempel kommer angivelsen "import module java.base" att importera alla 54 paket som ingÄr i modulen java.base, vilket tidigare skulle ha krÀvts att nÀmnas separat ("import java.io.*", "import java.util.*" osv.).
- En fjÀrde preliminÀr implementation av implicit deklarerade klasser och anonyma instanser av metoden "main" har lagts till, dÀr man kan klara sig utan deklarationer av public/static, överföring av argumentarray och andra entiteter relaterade till klassdeklaration. // tidigare public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } // nu kan man void main() { System.out.println("Hello, World!"); }
- Ett fjÀrde preliminÀrt alternativ av API för strukturerad parallellitet (Structured Concurrency) har föreslagits för testning, vilket förenklar utvecklingen av flertrÄdade applikationer genom att behandla flera uppgifter som körs i olika trÄdar som en enhetlig block.
- I API:erna KeyPairGenerator, Signature och KeyFactory har stöd för algoritmerna ML-KEM (CRYSTALS-Kyber) och ML-DSA (CRYSTALS-Dilithium) lagts till, som har standardiserats av det nationella institutet för standarder och teknik i USA (NIST) och Àr kvantmotstÄndiga. Dessa algoritmer anvÀnder kryptografiska metoder som baseras pÄ lösningen av problem inom gitterteori, vars lösningstid inte skiljer sig pÄ vanliga och kvantdatorer.
- I samlaren ZGC har stödet för det icke-generativa lÀget tagits bort, vilket inte separerade bearbetningen av "gamla" och "unga" objekt. FrÄn och med Java SE 23 tillÀmpas det generativa lÀget i ZGC som standard.
- Varningar har lagts till för anvÀndningen av API:er som JNI (Java Native Interface) och FFM (Foreign Function & Memory) för att förbereda utvecklare för begrÀnsningar av tillgÄngen till dessa API:er pÄ grund av införandet av en integritetssÀkring i kommande versioner som som standard förbjuder interaktion med inbyggd kod.
- Varningar har aktiverats vid anvÀndning av metoder för att komma Ät extern minne (utanför JVM) som tillhandahÄlls av klassen sun.misc.Unsafe. För att fÄ Ätkomst till minne utanför heapen och interagera med extern kod rekommenderas det att anvÀnda VarHandle API. I den senaste versionen förklarades stödet för sun.misc.Unsafe vara förÄldrat.
- Security Manager har stÀngts av, vilket lÀnge har förlorat sin relevans och blivit oanvÀndbart efter att stödet för webblÀsartillÀgget upphörde. Security Manager blev förÄldrad i Java 17. I en av kommande versioner planeras att koden för Security Manager helt tas bort.
- Koden för att stödja den 32-bitars plattformen av Windows pÄ x86-system har tagits bort. Java-porten för 32-bitars x86-system har förklarats förÄldrad och planeras att tas bort (stöd för Linux pÄ 32-bitars x86-system kommer att upphöra).
Ytterligare kan nÀmnas publiceringen av plattformsuppdateringen för att skapa applikationer med JavaFX 24 och den nya versionen av den universella virtuella maskinen GraalVM, som stöder körning av applikationer i JavaScript (Node.js), Python, Ruby, R, alla sprÄk för JVM (Java, Scala, Clojure, Kotlin) och sprÄk för vilket bitkod LLVM kan genereras (C, C++, Rust). Utöver stödet för JDK 24 har nya versionen av GraalVM genomfört optimeringar för maskininlÀrningsrelaterade uppgifter, förbÀttrat stödet för kompilering av Java-bytecode till maskinkod, och lagt till mekanismen SkipFlow för att minska storleken pÄ körbara filer och minska kompileringstiden.
KĂ€lla: opennet.ru
