Efter sex mĂ„naders utveckling publicerade Oracle plattformen Java SE 25 (Java Platform, Standard Edition 24), dĂ€r den referensimplementation som anvĂ€nds Ă€r det öppna projektet OpenJDK. Förutom att vissa förĂ„ldrade funktioner togs bort, bevarades bakĂ„tkompatibiliteten med tidigare versioner av Java-plattformen i Java SE 25 â de flesta tidigare skrivna Java-projekt kommer att fungera utan Ă€ndringar under den nya versionen. FĂ€rdiga installationspaket för Java SE 25 (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 för Java SE 25 Ă€r helt öppen under GPLv2-licensen med undantag för GNU ClassPath, som tillĂ„ter dynamisk lĂ€nkning med kommersiella produkter.
Java SE 25 klassificeras som en version med utökat stöd, med uppdateringar som kommer att slÀppas fram till 2033 (offentliga uppdateringar kommer att slÀppas fram till september 2030). Versionerna Java SE 17 och 21 fortsÀtter ocksÄ att stödjas som LTS-versioner, med uppdateringar som kommer att slÀppas fram till 2029 respektive 2031 (offentliga uppdateringar fram till 2026 och 2028). Utvidgat LTS-stöd för Java SE 8 och 11 kommer att pÄgÄ till 2030 respektive 2032.
Bland de nya funktioner som erbjuds i Java SE 25 (1, 2, 3, 4):
- En experimentell API, StableValue, har lagts till för att arbeta med objekt som innehÄller oförÀnderliga data och hanteras i JVM som konstanter. SÄdana objekt fÄr prestationsoptimeringar som liknar fÀlt med nyckelordet "final". StableValue API separerar skapandet av permanenta vÀrden och deras initialisering, sÀkerstÀller att vÀrdet endast kan initialiseras en gÄng, minskar programstarttiden och möjliggör anvÀndning av konstantutfÀllning (constant-folding) i anvÀndarkod, vilket tidigare endast anvÀndes i intern JDK-kod. class Application { // Tidigare: // static final UserService USERS = new UserService(); // Nu: static final StableValue USERS = StableValue.of(); public static UserService users() { return USERS.orElseSet(UserService::new); } }
- En experimentell API har lagts till för att koda och avkoda objekt med kryptografiska nycklar, certifikat och listor över Äterkallade certifikat, med hjÀlp av PEM-formatet (Pivacy-Enhanced Mail).
- Stödet för Scoped Values har lagts till, vilket möjliggör delning av oförÀnderliga data mellan trÄdar och effektiv datadelning mellan undertrÄdar (vÀrdena Àrvs). Scoped Values utvecklas för att ersÀtta mekanismen för trÄd-lokala variabler och Àr mer effektiva nÀr ett mycket stort antal virtuella trÄdar anvÀnds (tusentals och miljoner trÄdar). Huvudskillnaden mellan Scoped Values och trÄd-lokala variabler Àr att de senare skrivs en gÄng, kan inte Àndras och Àr endast tillgÀngliga under körning av trÄden.
- Ett API för anvÀndning av kryptografiska nyckelgenereringsfunktioner (KDF, key derivation function) har lagts till, vilket möjliggör skapandet av ytterligare nycklar av nödvÀndig lÀngd baserat pÄ en hemlig nyckel (t.ex. ett lösenord) och en godtycklig mÀngd data.
- Koden och byggscenarierna för stöd av 32-bitars x86-system har tagits bort. Avvecklingen av stödet för 32-bitars x86-system har förenklat infrastrukturen för byggande och testning av JDK samt möjliggjort implementering av funktioner kopplade till plattformar utan att skapa fallback-hanterare för 32-bitars x86-system.
- Möjligheten att anvĂ€nda ett enda uttryck "import module M" för att importera alla paket som exporteras av den angivna modulen har lagts till. Ăndringen förenklar avsevĂ€rt Ă„teranvĂ€ndningen av modulĂ€ra bibliotek, vilket gör det möjligt att ansluta bibliotek och klasser utan att definiera deras plats i paketstrukturen. Till exempel kommer "import module java.base" att importera alla 54 paket som ingĂ„r i modulen java.base, vilket tidigare skulle ha krĂ€vt att de nĂ€mndes separat ("import java.io.*", "import java.util.*" etc.).
- Ett kompakt alternativ för programmeringsformat har föreslagits, vilket kan vara anvÀndbart för undervisning och utveckling av smÄ applikationer. I den kompakta formen krÀvs ingen definition av överskottiga klasser, typiska API:er importeras automatiskt och förenklade in-/utdata-metoder Àr tillgÀngliga. Till exempel kan applikationen "Hello, World!" reduceras till: void main() { IO.println("Hello, World!"); }
- Det Ă€r tillĂ„tet att ange uttryck i konstruktörer före anropet av super(âŠ), som anvĂ€nds för att explicit anropa konstruktören av förĂ€ldraklassen 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(); } } }
- Den generativa driftsmoden för skrÀpsamlaren Shenandoah har lagts till, vilket innebÀr att gamla och nyligen skapade objekt hanteras separat för att öka effektiviteten vid rensning av objekt med kort livslÀngd. Den nya driftsmoden ger mer förutsÀgbar genomströmning, motstÄndskraft mot förÀndrad belastning och minskat minnesanvÀndning vid skrÀpsamling. Shenadoah-schemalÀggaren syftar till att minska stopp-tiden under skrÀpsamling genom att utföra ett större arbete parallellt med körningen av Java-applikationer.
- Det har förenklats att skapa cache för Ahead-of-Time-laddning och kompilering av klasser, vilket gör det möjligt att snabba upp starten av HotSpot JVM genom att anvĂ€nda klasser i ett redan laddat och kompilerat tillstĂ„nd. Vid start krĂ€vs inte lĂ€ngre separata operationer för att registrera aktiviteter och skapa cache, utan det rĂ€cker med ett enda kommando: java -XX:AOTCacheOutput=app.aot -cp app.jar com.example.App âŠ
- Vid start av HotSpot Java VM har möjligheten att anvĂ€nda metodernas körningsprofiler, som samlades in under den föregĂ„ende körningen av applikationen, implementerats. Ăndringen gör det möjligt för JIT-kompilatorn att undvika att samla in statistik och omedelbart börja generera nativ kod utan att vĂ€nta pĂ„ profilens bildande.
- I HotSpot JVM har stöd för kompakta objekt-headerar implementerats, vars storlek pÄ 64-bitars system har minskats frÄn 96 till 64 bitar (frÄn 12 till 8 byte). Minskat header-storlek gör att heap-storleken kan reduceras och effektiviteten i cachen kan förbÀttras.
- En föreslagen testimplementering av Vector-API:et erbjuder funktioner för vektorberÀkningar, som utförs med hjÀlp av vektorinstruktioner för x86_64- och AArch64-processorer. Det möjliggör tillÀmpning av operationer samtidigt pÄ flera vÀrden (SIMD). Till skillnad frÄn de auto-vektoriseringsmöjligheter som erbjuds i JIT-kompilatorn HotSpot ger det nya API:et möjlighet att explicit styra vektorisering för parallell databehandling.
- En femte preliminÀra version av API:et för strukturerad parallellism (Structured Concurrency) har föreslagits för testning. Denna version förenklar utvecklingen av flertrÄdiga applikationer genom att hantera flera uppgifter som körs i olika trÄdar som en enhetlig block.
- I mönstermatchningsmekanismen har den tredje preliminÀra versionen föreslagits, vilket möjliggö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. switch (x.getStatus()) { case 0 -> «okay»; case 1 -> «warning»; case 2 -> «error»; case int i -> «unknown status: » + i; } if (i instanceof byte b) { ⊠b ⊠}
- I JDK Flight Recorder (JFR) har experimentellt stöd för profileringsfunktioner med mer exakt spÄrning av CPU-resursanvÀndning pÄ Linux-plattformen lagts till. Information om körning av olika konstruktioner kan visualiseras tydligt med hjÀlp av fÀrgade diagram kallade «FlameGraph».
- Stabiliteten hos JDK Flight Recorder (JFR) har ökat vid asynkron sampling av Java-trÄdstackar genom att endast göra en genomgÄng av samtalsstackar vid sÄ kallade «safepoints».
- I JDK Flight Recorder (JFR) har verktyg för spÄrning och utvÀrdering av metoder lagts till. Stöd ges för spÄrning av samtalsstackar för specifika metoder samt för att spela in exakt statistik över metodanrop, inklusive metrik som körningstid och antalet anrop.
KĂ€lla: opennet.ru
