Etter seks måneders utvikling har Oracle publisert Java SE 25 (Java Platform, Standard Edition 24), hvor OpenJDK-prosjektet brukes som referanseimplementering. Bortsett fra fjerning av noen utdaterte funksjoner, har Java SE 25 bevart bakoverkompatibiliteten med tidligere versjoner av Java-plattformen — de fleste eksisterende Java-prosjekter vil fungere uten endringer under den nye versjonen. Klare installasjonspakker for Java SE 25 (JDK, JRE og Server JRE) er forberedt for Linux (x86_64, AArch64), Windows (x86_64) og macOS (x86_64, AArch64). Referanseimplementeringen av Java SE 25, utviklet gjennom OpenJDK-prosjektet, er helt åpen under GPLv2-lisensen med unntak for GNU ClassPath, som tillater dynamisk binding til kommersielle produkter.
Java SE 25 hører til utgivelsene med utvidet støtte, oppdateringer for den vil bli utgitt fram til 2033 (offentlige oppdateringer vil bli utgitt til september 2030). Som LTS-grener fortsetter også Java SE 17 og 21 å bli støttet, med oppdateringer som vil bli utgitt fram til 2029 og 2031, henholdsvis (offentlige — til 2026 og 2028). Den utvidede støtten for LTS-grener som Java SE 8 og 11 vil vare til 2030 og 2032.
Blant nyvinningene i Java SE 25 (1, 2, 3, 4):
- Det er lagt til et eksperimentelt API StableValue for behandling av objekter som inneholder immutable data, som behandles i JVM som konstanter. Slike objekter får ytelsesoptimaliseringer tilsvarende felt med nøkkelordet «final». StableValue-API-et skiller mellom oppretting av faste verdier og deres initialisering, garanterer at verdien kun kan initialiseres én gang, reduserer oppstartstiden for programmer, og tillater bruk av optimalisering av konstantfolding i brukerkode, som tidligere kun ble brukt i intern kode i JDK. class Application { // Før: // static final UserService USERS = new UserService(); // Nå: static final StableValue USERS = StableValue.of(); public static UserService users() { return USERS.orElseSet(UserService::new); } }
- Det er lagt til et eksperimentelt API for koding og dekoding av objekter med kryptografiske nøkler, sertifikater og lister over tilbakekalte sertifikater, ved bruk av PEM-formatet (Privacy-Enhanced Mail).
- Støtte for Scope Values er lagt til, noe som gjør det mulig å dele uforanderlige data mellom trådene og effektivt utveksle data mellom undertråder (verdier arves). Scope Values utvikles for å erstatte mekanismen for tråd-lokale variabler (thread-local variables) og er mer effektive når man bruker et veldig stort antall virtuelle tråder (tusenvis eller millioner av tråder). Hovedforskjellen mellom Scope Values og tråd-lokale variabler er at de første skrives én gang, kan ikke endres senere og forblir tilgjengelige bare under hele trådens utførelsestid.
- API-er for bruk av kryptografiske nøkkeldrivingsfunksjoner (KDF, key derivation function) er lagt til, som gjør det mulig å generere ytterligere nøkkelverdier av nødvendig lengde basert på en hemmelig nøkkel (for eksempel passord) og et vilkårlig sett med data.
- Koden og byggeprosedyrene for støtte for 32-bits x86-systemer er fjernet. Opphør av støtte for 32-bits x86-systemer gjør at infrastrukturen for bygging og testing av JDK kan forenkles, og det gjør det også mulig å implementere plattformavhengige funksjoner uten å lage fallback-håndterere for 32-bits x86-systemer.
- Det er lagt til muligheten for å bruke et enkelt uttrykk «import module M» for å importere alle pakkene som eksporteres av den angitte modulen. Endringen forenkler gjenbruk av modulbiblioteker betydelig, noe som gjør det mulig å koble til biblioteker og klasser uten å måtte definere deres plassering i pakkehierarkiet. For eksempel vil angivelsen «import module java.base» føre til importering av alle 54 pakkene som inngår i modulen java.base, som tidligere måtte nevnes enkeltvis («import java.io.*», «import java.util.*» osv.).
- Et kompakt alternativ for programmering er foreslått, noe som kan være nyttig for læring og ved utvikling av små applikasjoner. I den kompakte formen kreves det ikke definisjon av unødvendige klasser, typiske API-er importeres automatisk, og forenklede metoder for inn/ut er tilgjengelige. For eksempel kan applikasjonen «Hello, World!» reduseres til: void main() { IO.println(«Hello, World!»); }
- Det er tillatt å spesifisere uttrykk i uttrykkskonstruktører før kallet til super(…), som brukes for eksplisitt å kalle konstruktøren til foreldreklassen fra konstruktøren til den arvede klassen, hvis disse uttrykkene ikke refererer til den instansen som opprettes av konstruktøren. class Outer { void hello() { System.out.println("Hello"); } class Inner { Inner() { hello(); super(); } } }
- Generativ modus for Shenandoah søppelsamleren er lagt til, hvor gamle og nylig opprettede objekter behandles separat for å øke effektiviteten i rensingen av objekter med kort levetid. Den nye modusen gir mer forutsigbar gjennomstrømning, motstand mot endringer i belastningen og redusert minneforbruk under søppelsamling. Shenandoah-planleggeren fokuserer på å redusere stoppetidene under søppelsamling ved å utføre mer arbeid parallelt med kjøringen av Java-applikasjoner.
- Oppretting av cache for Ahead-of-Time-lasting og sammenstilling av klasser er forenklet, noe som akselererer oppstart av HotSpot JVM ved å bruke klasser som allerede er lastet og sammenstilt. Når du starter, kreves det ikke lenger separate operasjoner for å skrive aktiviteter og opprette cache, og det er tilstrekkelig med én kommando: java -XX:AOTCacheOutput=app.aot -cp app.jar com.example.App …
- Ved oppstart av HotSpot Java VM er det mulig å bruke kjøremetodeprofiler innhentet ved forrige kjøring av applikasjonen. Denne endringen lar JIT-kompilatoren unngå å samle statistikk og umiddelbart begynne å generere maskinkode uten å vente på at profilen skal dannes.
- HotSpot JVM har fått støtte for kompakte objektoverskrifter, hvis størrelse på 64-biters systemer er redusert fra 96 til 64 biter (fra 12 til 8 byte). Reduksjonen i størrelsen på overskriftene gjør det mulig å redusere størrelsen på heapen og forbedre cache-effektiviteten.
- Foreslått er en testimplementering av API Vector, som gir funksjoner for vektorberegninger utført med vektorielle instruksjoner fra prosessorene x86_64 og AArch64, og som gjør det mulig å anvende operasjoner på flere verdier samtidig (SIMD). I motsetning til funksjonene for autotering av skalaroperasjoner som tilbys i JIT-kompilatoren HotSpot, gir det nye APIet mulighet for eksplisitt styring av vektorisering for parallell databehandling.
- Foreslått for testing er den femte preliminære versjonen av APIet for strukturert parallellisme, som forenkler utviklingen av flertrådede applikasjoner ved å behandle flere oppgaver, som kjøres i forskjellige tråder, som en enhetlig blokk.
- I mønster-matching mekanisme er den tredje preliminære versjonen av muligheten for bruk av primitive typer (int, byte, char og andre grunnleggende typer som ikke er objekter) foreslått for alle typer maler, i operatoren «instanceof» og i «switch»-blokker. switch (x.getStatus()) { case 0 -> «ok»; case 1 -> «advarsel»; case 2 -> «feil»; case int i -> «ukjent status: » + i; } if (i instanceof byte b) { … b … }
- I JDK Flight Recorder (JFR) er det lagt til eksperimentell støtte for profilering med mer presis sporing av CPU-ressursbruk på Linux-plattformen. Informasjonen om kjøretid for ulike konstruksjoner kan visualiseres tydelig ved hjelp av fargegrafene «FlameGraph».
- Stabiliteten i JDK Flight Recorder (JFR) har blitt forbedret ved asynkron sampling av stakkene i Java-tråder ved å omgå stakkene som kun inneholder «sikre punkter» (safepoints).
- I JDK Flight Recorder (JFR) er det lagt til verktøy for sporing og vurdering av metodenes kjøretid. Støtte for sporing av stakkene for spesifikke metoder og registrering av nøyaktig statistikk over metodekall som dekker målinger som kjøretid og antall kall er inkludert.
Kilde: opennet.ru
