Efter seks måneders udvikling har Oracle offentliggjort platformen Java SE 25 (Java Platform, Standard Edition 24), hvor den referenceimplementering, der bruges, er det åbne projekt OpenJDK. Bortset fra fjernelsen af nogle forældede funktioner i Java SE 25 er tilbageretteligheden med tidligere versioner af Java-platformen bevaret – de fleste tidligere skrevne Java-projekter vil fungere uden ændringer under den nye version. De klar-til-installation versioner af Java SE 25 (JDK, JRE og Server JRE) er gjort tilgængelige for Linux (x86_64, AArch64), Windows (x86_64) og macOS (x86_64, AArch64). Den referenceimplementering af Java SE 25, der er udviklet under OpenJDK-projektet, er helt åben under GPLv2-licensen med undtagelser fra GNU ClassPath, der tillader dynamisk binding til kommercielle produkter.
Java SE 25 er klassificeret som en version med forlænget support, hvortil opdateringer vil blive udgivet indtil 2033 (offentlige opdateringer vil blive udgivet indtil september 2030). Som en langvarig supportgren (LTS) fortsætter også grene af Java SE 17 og 21 med at blive vedligeholdt, med opdateringer, der vil blive udgivet indtil 2029 og 2031 henholdsvis (offentlige opdateringer – indtil 2026 og 2028). Den udvidede support for LTS-grenene Java SE 8 og 11 vil vare indtil 2030 og 2032.
Blandt de nye funktioner i Java SE 25 (1, 2, 3, 4):
- Der er tilføjet et eksperimentelt API, StableValue, til arbejdet med objekter, der indeholder uforanderlige data og behandles i JVM som konstanter. Sådanne objekter underkastes optimeringer af ydelsen, svarende til felter med nøgleordet „final“. StableValue API'et adskiller oprettelsen af konstante værdier fra deres initialisering, sikrer, at en værdi kun kan initialiseres én gang, reducerer opstartstiden for programmer og muliggør anvendelsen af optimeringer af konstantfoldning (constant-folding) i brugerens kode, tidligere kun anvendt i JDK's interne kode. class Application { // Før: // static final UserService USERS = new UserService(); // Efter: static final StableValue USERS = StableValue.of(); public static UserService users() { return USERS.orElseSet(UserService::new); } }
- Der er tilføjet et eksperimentelt API til kodning og dekodning af objekter med kryptografiske nøgler, certifikater og lister over tilbagekaldte certifikater ved hjælp af PEM-formatet (Privacy-Enhanced Mail).
- Der er tilføjet støtte for Scoped Values, som muliggør deling af uforanderlige data mellem tråde og effektiv dataudveksling mellem undertråde (værdierne er arvet). Scoped Values udvikles for at erstatte mekanismen for tråd-lokale variabler (thread-local variables) og er mere effektive, når der anvendes et meget stort antal virtuelle tråde (tusinder og millioner af tråde). Den primære forskel mellem Scoped Values og tråd-lokale variable er, at de førstnævnte skrives én gang, ikke kan ændres efterfølgende, og kun er tilgængelige under trådens udførelse.
- API'et tilføjes for brug af kryptografiske funktioner til nøgleafledning (KDF, key derivation function), der muliggør dannelse af yderligere nøgler af den ønskede længde baseret på en hemmelig nøgle (fx et kodeord) og et vilkårligt datalag.
- Koden og build-scripts til støtte for 32-bit x86-systemer er blevet fjernet. Ophøret af støtten til 32-bit x86-systemer har gjort det muligt at forenkle infrastrukturen til bygning og testning af JDK, samt muliggøre implementering af funktioner afhængige af platforme uden at skulle skabe fallback-håndterere for 32-bit x86-systemer.
- Det er nu muligt at bruge én udtryksform «import module M» for at importere alle pakker, der eksporteres af den angivne modul. Denne ændring gør det væsentligt lettere at genbruge modulære biblioteker, da biblioteker og klasser kan tilsluttes uden at definere deres placering i pakkhierarkiet. For eksempel vil angivelsen «import module java.base» medføre import af alle 54 pakker, der er en del af modulet java.base, som tidligere skulle nævnes individuelt («import java.io.*», «import java.util.*» osv.).
- Et kompakt design til programmer er blevet foreslået, hvilket kan være nyttigt til undervisning og udvikling af små applikationer. I den kompakte form kræves der ikke definition af overflødige klasser, typiske API'er importeres automatisk, og forenklede ind- og udgangsmetoder er tilgængelige. For eksempel kan applikationen «Hello, World!» reduceres til: void main() { IO.println(«Hello, World!»); }
- Det er tilladt at angive udtryk i udtryksbyggere før kaldet til super(...), som bruges til eksplicit at kalde konstruktøren for den overordnede klasse fra konstruktøren af den arvede klasse, hvis disse udtryk ikke refererer til den instans, der oprettes af konstruktøren. class Outer { void hello() { System.out.println("Hello"); } class Inner { Inner() { hello(); super(); } } }
- Der er tilføjet en generativ tilstand for Shenandoah affaldsindsamleren, hvor gamle og nyligt oprettede objekter behandles separat for at forbedre effektiviteten af oprydningen af objekter med kort levetid. Den nye tilstand giver mere forudsigelig gennemløb, modstandsdygtighed over for belastningsændringer og reduceret hukommelsesforbrug under affaldsindsamling. Shenandoah-planlæggeren sigter mod at reducere stop-tiderne under affaldsindsamling ved at udføre en større mængde arbejde parallelt med kørsel af Java-applikationer.
- Det er blevet lettere at oprette caches til Ahead-of-Time-læsning og sammensætning af klasser, hvilket hurtigere kan starte HotSpot JVM ved at aktivere klasserne i en allerede indlæst og sammensat tilstand. Ved opstart kræves der ikke længere separate operationer til at registrere aktivitet og oprette cache; det er nok med en enkelt kommando: java -XX:AOTCacheOutput=app.aot -cp app.jar com.example.App …
- Ved opstart af HotSpot Java VM er der implementeret mulighed for at bruge profiler for metodeudførelse, der er opnået ved den tidligere kørsel af applikationen. Ændringen gør det muligt for JIT-kompilatoren at undgå at indsamle statistik og straks begynde at generere native kode uden at vente på dannelsen af profilen.
- Der er implementeret støtte til kompakte objektoverskrifter i HotSpot JVM, hvis størrelse på 64-bit systemer er reduceret fra 96 til 64 bit (fra 12 til 8 byte). Reduceringen af overskriftens størrelse gør det muligt at forkorte bunken og øge cache-effektiviteten.
- Den foreslåede testimplementering af API Vector tilbyder funktioner til vektorberegning, der udføres ved hjælp af vektor-instruktioner fra x86_64- og AArch64-processorerne og gør det muligt at anvende operationer på flere værdier samtidigt (SIMD). I modsætning til de muligheder, der tilbydes af JIT-kompilatoren HotSpot for automatisk vektorisering af skalære operationer, giver det nye API mulighed for eksplicit at styre vektoriseringen til parallel databehandling.
- Den femte pre-release version af API til struktureret parallelisme (Structured Concurrency) er blevet foreslået til test. Den forenkler udviklingen af multitrådede applikationer ved at behandle flere opgaver, der udføres i forskellige tråde, som én enkelt blok.
- I mønster-matchingsmekanismen er den tredje pre-release version af muligheden for at bruge primitive typer (int, byte, char og andre grundlæggende typer, der ikke er objekter) blevet foreslået i alle typer skabeloner, i operatoren 'instanceof' og i 'switch'-blokke. 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) er der tilføjet eksperimentel understøttelse af profilering med mere præcis overvågning af CPU-ressourceforbrug på Linux-platformen. Informationen om køretiden af forskellige konstruktioner kan visuelt præsenteres ved hjælp af farvede diagrammer kaldet 'FlameGraph'.
- Stabiliteten af JDK Flight Recorder (JFR) er forbedret ved asynkron sampling af Java-trådets stakke ved kun at gennemgå kaldestakken ved 'sikre punkter' (safepoints).
- I JDK Flight Recorder (JFR) er der tilføjet værktøjer til sporing og vurdering af metodekørselstid. Der understøttes sporingsfunktioner for stakken af specifikke metoder og optagelse af præcise statistikker om metodekald, der dækker metrikker som udførelsestid og antal kald.
Kilde: opennet.ru
