Release van Java SE 25 LTS en OpenJDK 25

Na zes maanden ontwikkeling heeft Oracle het Java SE 25-platform (Java Platform, Standard Edition 24) gepubliceerd, waarbij het open project OpenJDK als referentie-implementatie wordt gebruikt. Behalve het verwijderen van enkele verouderde functionaliteiten, behoudt Java SE 25 de achterwaartse compatibiliteit met eerdere versies van het Java-platform — de meeste eerder geschreven Java-projecten zullen zonder wijzigingen blijven functioneren op de nieuwe versie. De kant-en-klare installaties van Java SE 25 (JDK, JRE en Server JRE) zijn voorbereid voor Linux (x86_64, AArch64), Windows (x86_64) en macOS (x86_64, AArch64). De referentie-implementatie van Java SE 25, ontwikkeld binnen het OpenJDK-project, is volledig open onder de GPLv2-licentie met uitzonderingen van GNU ClassPath, die dynamische koppeling met commerciële producten toestaan.

Java SE 25 valt onder de releases met een verlengde ondersteuningsperiode, waarvoor updates beschikbaar zullen zijn tot 2033 (publieke updates worden uitgebracht tot september 2030). De versies Java SE 17 en 21 blijven ook onder de langdurige ondersteuningslijn (LTS) en krijgen updates tot respectievelijk 2029 en 2031 (publieke updates tot 2026 en 2028). De uitgebreide ondersteuning van LTS-versies Java SE 8 en 11 zal duren tot 2030 en 2032.

Onder de nieuwigheden die in Java SE 25 worden aangeboden (1, 2, 3, 4):

  • Een experimentele API StableValue is toegevoegd voor het werken met objecten die onveranderlijke gegevens bevatten en die in de JVM als constanten worden behandeld. Deze objecten profiteren van prestatie-optimalisaties die vergelijkbaar zijn met velden met het sleutelwoord 'final'. De API StableValue scheidt de creatie van constante waarden en hun initialisatie, garandeert dat een waarde slechts één keer kan worden geïnitialiseerd, verkort de opstarttijd van programma's en maakt optimalisatie van constante samenvattingen (constant-folding) mogelijk in gebruikercode, wat eerder alleen in interne JDK-code werd gebruikt. class Application { // Voorheen: // static final UserService USERS = new UserService(); // Heden: static final StableValue USERS = StableValue.of(); public static UserService users() { return USERS.orElseSet(UserService::new); } }
  • Een experimentele API is toegevoegd voor het coderen en decoderen van objecten met cryptografische sleutels, certificaten en lijsten van ingetrokken certificaten, gebruikmakend van het PEM-formaat (Privacy-Enhanced Mail).
  • Ondersteuning voor Scoped Values is toegevoegd, waardoor onveranderlijke gegevens kunnen worden gedeeld tussen threads en efficiënt kunnen worden uitgewisseld tussen sub-threads (waarden worden geërfd). Scoped Values worden ontwikkeld ter vervanging van thread-lokale variabelen en zijn efficiënter bij het gebruik van een zeer groot aantal virtuele threads (duizenden en miljoenen threads). Het belangrijkste verschil tussen Scoped Values en thread-lokale variabelen is dat de eerste één keer worden geschreven, daarna niet kunnen worden veranderd en alleen beschikbaar blijven tijdens de uitvoering van de thread.
  • API voor het gebruik van cryptografische functie voor sleutelafleiding (KDF, key derivation function) is toegevoegd, waardoor het mogelijk is om extra sleutels van de benodigde lengte te genereren op basis van de geheime sleutel (bijvoorbeeld een wachtwoord) en een willekeurige set gegevens.
  • De code en bouwscripts ter ondersteuning van 32-bit x86 systemen zijn verwijderd. Het stopzetten van ondersteuning voor 32-bit x86 systemen heeft de infrastructuur voor het bouwen en testen van JDK vereenvoudigd, en heeft het mogelijk gemaakt om functies te implementeren die aan specifieke platforms zijn verbonden, zonder fallback-handlers voor 32-bit x86 systemen te moeten creëren.
  • De mogelijkheid is toegevoegd om één expressie "import module M" te gebruiken om alle door de opgegeven module geëxporteerde pakketten tegelijk te importeren. Deze wijziging vereenvoudigt het hergebruik van modulaire bibliotheken, waardoor bibliotheken en klassen kunnen worden verbonden zonder hun locatie in de hiërarchie van pakketten te definiëren. Bijvoorbeeld, het opgeven van "import module java.base" zal leiden tot de import van alle 54 pakketten die deel uitmaken van de module java.base, die eerder afzonderlijk moesten worden genoemd ("import java.io.*", "import java.util.*", enzovoort).
  • Een compacte versie van programmavormgeving is voorgesteld, die nuttig kan zijn voor onderwijs en bij de ontwikkeling van kleine applicaties. In de compacte vorm is er geen definitie van overbodige klassen nodig, typische API's worden automatisch geïmporteerd en vereenvoudigde invoer-/uitvoer-methoden zijn beschikbaar. Bijvoorbeeld, de applicatie "Hello, World!" kan worden vereenvoudigd tot: void main() { IO.println("Hello, World!"); }
  • Het is toegestaan om uitdrukkingen in de constructeurs specifiëren voordat super(…) wordt aangeroepen, wat wordt gebruikt voor het expliciet aanroepen van de constructor van de bovenliggende klasse vanuit de constructor van de afgeleide klasse, mits deze uitdrukkingen niet verwijzen naar het exemplaar dat door de constructor wordt gemaakt. class Outer { void hello() { System.out.println("Hello"); } class Inner { Inner() { hello(); super(); } } }
  • De generatieve modus van de Shenandoah garbage collector is toegevoegd, waarbij oude en recent aangemaakte objecten apart worden behandeld om de efficiëntie van het opruimen van objecten met een korte levensduur te verbeteren. De nieuwe modus zorgt voor een meer voorspelbare doorvoersnelheid, weerstand tegen veranderingen in de belasting en een vermindering van het geheugengebruik tijdens het garbage collection. De Shenandoah scheduler richt zich op het verkorten van de stilstandtijd tijdens het garbage collection door meer werk parallel aan de uitvoering van Java-toepassingen uit te voeren.
  • De creatie van een cache voor AOT (Ahead-of-Time) laden en samenstellen van klassen is vereenvoudigd, waardoor de opstarttijd van de HotSpot JVM kan worden versneld door gebruik te maken van klassen in een al geladen en samengevoegd toestand. Bij het opstarten zijn er geen aparte bewerkingen meer nodig voor het registreren van activiteiten en het aanmaken van een cache; één commando is voldoende: java -XX:AOTCacheOutput=app.aot -cp app.jar com.example.App …
  • Bij het starten van de HotSpot Java VM is de mogelijkheid geïmplementeerd om uitvoeringsprofielen van methoden te gebruiken die zijn verkregen tijdens de vorige uitvoering van de toepassing. Deze wijziging stelt de JIT-compiler in staat om zonder het accumuleren van statistieken meteen native code te genereren zonder te wachten op het opstellen van een profiel.
  • In de HotSpot JVM is de ondersteuning voor compacte objectheaders geïmplementeerd, waarvan de grootte op 64-bits systemen is verminderd van 96 naar 64 bit (van 12 naar 8 byte). Het verkleinen van de header-grootte leidt tot een verminderde heap-grootte en verhoogt de effectiviteit van de cache.
  • Een testimplementatie van de Vector API is voorgesteld, die functies biedt voor vectorberekeningen die worden uitgevoerd met behulp van vectorinstructies van x86_64 en AArch64 processors en die tegelijkertijd operaties op meerdere waarden kunnen toepassen (SIMD). In tegenstelling tot de auto-vectorisatie van scalaire operaties die wordt geboden door de JIT-compiler HotSpot, biedt de nieuwe API de mogelijkheid om de vectorisatie expliciet te beheren voor parallelle gegevensverwerking.
  • Een vijfde voorlopige variant van de API voor gestructureerde parallelisme (Structured Concurrency) is voorgesteld voor testdoeleinden, die de ontwikkeling van multi-threaded applicaties vergemakkelijkt door meerdere taken die in verschillende threads worden uitgevoerd als één enkele blok te behandelen.
  • In het patroonmatchingmechanisme is een derde voorlopige variant voorgesteld voor het gebruik van primitieve types (int, byte, char en andere basis types die geen objecten zijn) in alle soorten sjablonen, in de 'instanceof'-operator en in 'switch'-blokken. switch (x.getStatus()) { case 0 -> "okay"; case 1 -> "warning"; case 2 -> "error"; case int i -> "unknown status: " + i; } if (i instanceof byte b) { … b … }
  • In JDK Flight Recorder (JFR) is experimentele ondersteuning toegevoegd voor profiling met een meer nauwkeurige tracking van CPU-bronnen op het Linux-platform. Informatie over de uitvoeringstijd van verschillende constructies kan visueel worden weergegeven met behulp van gekleurde diagrammen genaamd "FlameGraph".
  • De stabiliteit van JDK Flight Recorder (JFR) is verbeterd bij het asynchroon monsteren van Java-draadstapels door alleen op "veilige punten" (safepoints) in de aanroepstack te omzeilen.
  • In JDK Flight Recorder (JFR) zijn hulpmiddelen voor het traceren en evalueren van de uitvoeringstijd van methoden toegevoegd. Ondersteuning wordt geboden voor het traceren van de aanroepstack van specifieke methoden en het vastleggen van nauwkeurige statistieken over methodaanroepen, inclusief metrische gegevens zoals uitvoeringstijd en aantal aanroepen.

Bron: opennet.ru

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster