Na zes maanden ontwikkeling heeft Oracle het Java SE 24-platform (Java Platform, Standard Edition 24) gepubliceerd, waarvan de referentie-implementatie gebruikmaakt van het open project OpenJDK. Behalve de verwijdering van enkele verouderde mogelijkheden, behoudt Java SE 24 de achterwaartse compatibiliteit met eerdere versies van het Java-platformāde meeste eerder geschreven Java-projecten zullen zonder wijzigingen werken op de nieuwe versie. Klaar-voor-installatie pakketten van Java SE 24 (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 24, 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 24 valt in de categorie releases met een reguliere ondersteuningsperiode, waarbij updates worden uitgebracht tot de volgende release. Voor een versie met lange termijn ondersteuning (LTS) dient Java SE 21 of Java SE 17 gebruikt te worden, waarvan updates respectievelijk tot 2031 en 2029 worden uitgebracht (openbaar tot 2028 en 2026). De uitgebreide ondersteuning voor de LTS-versie Java SE 8 loopt tot 2030, en voor Java SE 11 tot 2032. De volgende LTS-release wordt de herfstrelease Java SE 25.
Onder de nieuwigheden in Java SE 24 zijn:
- Er is een experimentele generatieve modus voor de Shenandoah-garbage collector voorgesteld, waarbij oude en recent gecreƫerde objecten afzonderlijk worden behandeld om de efficiƫntie van het opruimen van objecten met een korte levensduur te verhogen. De nieuwe modus biedt een voorspelbaardere doorvoer, robuustheid tegen belastingvariaties en vermindert het geheugenverbruik tijdens garbage collection. De Shenandoah-planificator is gericht op het verminderen van de stilstandstijd tijdens garbage collection door een groter volume aan werk parallel aan de uitvoering van Java-applicaties uit te voeren.
- In de HotSpot JVM is experimentele ondersteuning voor compacte objectheaders geïmplementeerd, waarvan de grootte op 64-bit systemen is verminderd van 96 naar 64 bits (van 12 naar 8 bytes). De afname van de header-grootte maakt het mogelijk om de heap-grootte te verkleinen en de cache-efficiëntie te verbeteren.
- In de garbage collector G1 is de implementatie van barriĆØres vereenvoudigd, die de toegang van de applicatie tot het geheugen volgen. In de nieuwe versie zijn de operaties voor het uitbreiden van barriĆØres verplaatst naar een latere fase van de compilatie in C2 JIT. Uitgevoerde tests tonen aan dat deze verhuizing de overhead in de C2 JIT-compiler met 10-20% kan verlagen, afhankelijk van de applicatie.
- Een API is toegevoegd voor het gebruik van cryptografische functies voor sleutelvorming (KDF, key derivation function), waarmee extra sleutels van de vereiste lengte kunnen worden gegenereerd op basis van een geheime sleutel (bijvoorbeeld een wachtwoord) en een willekeurige set gegevens. De KDF API heeft momenteel een voorlopige status (preview).
- De mogelijkheid voor voorspellende (Ahead-of-Time) laad- en bundeling van klassen is toegevoegd. Deze wijziging versnelt de opstart van de HotSpot JVM door de in de applicatie gebruikte klassen in een reeds geladen en gebundelde toestand aan te bieden. Bij de eerste opstart van de applicatie wordt de status van alle klassen in de cache opgeslagen en wordt deze gebruikt om de laadtijd bij volgende opstarts te versnellen.
- Een Class-File API is toegevoegd voor het parseren, genereren en transformeren van Java klassebestanden.
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); } } });
- Een uitgebreide Stream-API is toegevoegd die de definitie van eigen tussenoperaties ondersteunt, die nuttig kunnen zijn wanneer bestaande ingebouwde tussenoperaties niet voldoende zijn voor de gewenste gegevensomzetting. Eigen handlers worden aangesloten via de nieuwe tussenoperatie Stream::gather(Gatherer), die elementen van de stroom verwerkt met behulp van de door de gebruiker opgegeven handler. 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]]
- De vierde voorlopige implementatie van Scoped Values is voorgesteld, waarmee ongewijzigde gegevens kunnen worden gedeeld tussen threads en efficiƫnt gegevens kunnen worden uitgewisseld tussen kindthreads (waarden worden geƫrfd). Scoped Values worden ontwikkeld ter vervanging van thread-lokale variabelen en zijn efficiƫnter bij 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 slechts ƩƩn keer worden geschreven, daarna niet meer kunnen worden gewijzigd en alleen beschikbaar zijn tijdens de uitvoering van de thread.
- In de patronenmatchingmechanismen is voorlopige ondersteuning toegevoegd voor het gebruik van primitieve types (int, byte, char en andere basistypes die geen objecten zijn) in alle soorten templates, 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 ⦠}
- De negende voorlopige implementatie 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 waarmee gelijktijdig operaties op meerdere waarden kunnen worden toegepast (SIMD). In tegenstelling tot de auto-vectorisatie van scalair operaties die door de HotSpot JIT-compiler wordt aangeboden, stelt de nieuwe API gebruikers in staat om expliciet de vectorisatie voor parallelle gegevensverwerking te beheren.
- Ondersteuning voor synchronisatie van virtuele threads zonder deze te koppelen (pinning) aan threads die aan het platform zijn gerelateerd, is gerealiseerd. Virtuele threads in een gesynchroniseerde methode of uitdrukking in een geblokkeerde toestand maken nu hun platformthread vrij, waardoor andere virtuele threads deze kunnen gebruiken, wat het aantal beschikbare virtuele threads aanzienlijk vergroot en de schaalbaarheid verbetert van applicaties die gebruikmaken van multithreading.
- Er is een derde voorlopige variant toegevoegd die het mogelijk maakt om in expressieconstructors aan te geven voordat super(...) wordt aangeroepen, dat gebruikt wordt voor het expliciet aanroepen van de constructor van de ouderklasse vanuit de constructor van de afgeleide klasse, mits deze expressies niet naar de instantie verwijzen die door de constructor wordt aangemaakt. class Outer { void hello() { System.out.println("Hello"); } class Inner { Inner() { hello(); super(); } } }
- De jlink-tool ondersteunt nu het maken van runtime-images zonder gebruik te maken van JMOD-bestanden, wat de grootte van de JDK met ongeveer 25% kan verkleinen.
- Er is een tweede voorlopige variant toegevoegd voor het gebruik van de expressie "import module M" om direct alle pakketten te importeren die door de opgegeven module worden geƫxporteerd. Deze wijziging vereenvoudigt het hergebruik van modulaire bibliotheken aanzienlijk, waardoor bibliotheken en klassen kunnen worden aangesloten zonder hun locatie in de pakket hiƫrarchie te definiƫren. Bijvoorbeeld, het opgeven van "import module java.base" zal resulteren in de import van alle 54 pakketten die deel uitmaken van de java.base-module, die voorheen afzonderlijk vermeld moesten worden ("import java.io.*", "import java.util.*" etc.).
- Er is een vierde voorlopige implementatie toegevoegd van impliciet gedeclareerde klassen en anonieme instanties van de methode "main", waarin het mogelijk is om zonder public/static-declaraties, het doorgeven van een argumentenarray en andere entiteiten die verband houden met het declareren van een klasse te werken. // was public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } // nu is het mogelijk void main() { System.out.println("Hello, World!"); }
- Een vierde voorlopige variant van de API voor gestructureerde paralleliteit (Structured Concurrency) is voorgesteld voor testdoeleinden, wat de ontwikkeling van multithreaded applicaties vereenvoudigt door meerdere taken die in verschillende threads worden uitgevoerd als ƩƩn enkel blok te behandelen.
- In de API KeyPairGenerator, Signature en KeyFactory is ondersteuning toegevoegd voor de algoritmen ML-KEM (CRYSTALS-Kyber) en ML-DSA (CRYSTALS-Dilithium), gestandaardiseerd door het National Institute of Standards and Technology (NIST) van de VS en bestand tegen aanvallen met kwantumcomputers. Deze algoritmen maken gebruik van cryptografiemethoden die zijn gebaseerd op het oplossen van problemen van de lattice-theorie, waarvan de oplostijd niet verschilt tussen klassieke en kwantumcomputers.
- In de garbage collector ZGC is de ondersteuning voor de niet-generatieve modus die de verwerking van 'oude' en 'jonge' objecten niet scheidt verwijderd. Met Java SE 23 is de generatieve modus van ZGC standaard van toepassing.
- Er is een waarschuwing toegevoegd voor het gebruik van de JNI API (Java Native Interface) en FFM (Foreign Function & Memory) om ontwikkelaars voor te bereiden op de beperkte toegang tot deze API's die in een van de toekomstige releases door de introduce van een integriteitsmodus standaard zal worden verboden.
- Er is een waarschuwing geactiveerd bij het gebruik van methoden voor toegang tot externe geheugen (buiten de JVM), aangeboden door de klasse sun.misc.Unsafe. Voor toegang tot geheugen buiten de heap en interactie met externe code wordt het gebruik van de VarHandle API aanbevolen. In de vorige release werd de ondersteuning voor sun.misc.Unsafe als verouderd verklaard.
- De Security Manager is uitgeschakeld, die al geruime tijd verouderd is en niet meer nodig is na de beƫindiging van de ondersteuning voor browserplug-ins. De Security Manager werd verouderd verklaard in Java 17. In een van de volgende releases is er een plan om de code van de Security Manager volledig te verwijderen.
- De code voor de ondersteuning van het 32-bits Windows-platform op x86-systemen is verwijderd. De Java-port voor 32-bits systemen op x86 is als verouderd verklaard en zal worden verwijderd (ondersteuning voor Linux op 32-bits x86-systemen wordt beƫindigd).
Daarnaast kan worden opgemerkt dat er een update is gepubliceerd voor de JavaFX 24 platform voor het ontwikkelen van applicaties en dat er een nieuwe release is van de universele virtuele machine GraalVM, die ondersteuning biedt voor het uitvoeren van applicaties in JavaScript (Node.js), Python, Ruby, R, alle talen voor JVM (Java, Scala, Clojure, Kotlin) en talen waarvoor LLVM-bitcode kan worden gegenereerd (C, C++, Rust). Naast de ondersteuning voor JDK 24 zijn er optimalisaties doorgevoerd in de nieuwe versie van GraalVM om taken die verband houden met machine learning te verbeteren, de ondersteuning voor het compileren van Java-bytecode naar machinecode is verbeterd, en er is een SkipFlow-mechanisme toegevoegd om de bestandsgrootte van uitvoerbare bestanden te verkleinen en de compiletijd te verminderen.
Bron: opennet.ru
