Java SE 23 en OpenJDK 23 uitgebracht

Na zes maanden ontwikkeling heeft Oracle het Java SE 23-platform (Java Platform, Standard Edition 23) gepubliceerd, dat het open-source OpenJDK-project als referentie-implementatie gebruikt. Met uitzondering van het verwijderen van enkele verouderde functies, behoudt Java SE 23 achterwaartse compatibiliteit met eerdere releases van het Java-platform: de meeste eerder geschreven Java-projecten werken zonder wijzigingen onder de nieuwe versie. Kant-en-klare builds van Java SE 22 (JDK, JRE en Server JRE) zijn beschikbaar voor Linux (x86_64, AArch64), Windows (x86_64) en macOS (x86_64, AArch64). De Java 23-referentie-implementatie, ontwikkeld door het OpenJDK-project, is volledig open-source onder de GPLv2-licentie met GNU ClassPath-uitzonderingen die dynamische koppeling met commerciële producten mogelijk maken.

Java SE 23 is gecategoriseerd als een reguliere ondersteuningsrelease, met updates die worden uitgebracht tot de volgende release. De LTS-branch (Long-Term Support) zou Java SE 21 of Java SE 17 moeten zijn, met updates die respectievelijk tot 2031 en 2029 worden uitgebracht (doorgaans beschikbaar tot 2028 en 2026). De uitgebreide ondersteuning voor de LTS-branch voor Java SE 8 duurt tot 2030 en voor Java SE 11 tot 2032.

Onder de 23 innovaties voorgesteld in Java SE:

  • De generatieve modus van de ZGC-garbage collector (Generational Z Garbage Collector) is standaard ingeschakeld. Deze modus verwerkt 'oude' en 'jonge' objecten afzonderlijk, wat de efficiëntie van het opschonen van recent aangemaakte objecten met een korte levensduur verhoogt. Generational ZGC vermindert het risico op onderbrekingen tijdens resourcetoewijzing en verlaagt de CPU-belasting en het geheugengebruik tijdens garbage collection. Tests van Generational ZGC met Apache Cassandra 4 toonden een viervoudige toename van de doorvoer bij een vaste heapgrootte en een afname van de heapgrootte met een kwart bij een ongewijzigde doorvoer.
  • JavaDoc heeft ondersteuning toegevoegd voor het gebruik van Markdown-opmaak om code in opmerkingen te documenteren. Deze opmaak kan worden gebruikt in plaats van een combinatie van HTML en JavaDoc @-tags.
    Java SE 23 en OpenJDK 23 uitgebracht
  • Mechanismen voor patroonherkenning zijn uitgebreid met voorlopige ondersteuning voor het gebruik van primitieve typen (int, byte, char en andere basistypen die geen object 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 … }
  • Voorlopige ondersteuning toegevoegd voor het gebruik van één enkele "import module M"-instructie om alle pakketten die door een bepaalde module worden geëxporteerd in één keer te importeren. Deze wijziging vereenvoudigt het hergebruik van modulaire bibliotheken aanzienlijk, doordat bibliotheken en klassen kunnen worden opgenomen zonder hun plaats in de pakkethiërarchie te hoeven specificeren. Als u bijvoorbeeld "import module java.base" opgeeft, worden alle 54 pakketten in de java.base-module geïmporteerd, waarnaar voorheen afzonderlijk moest worden verwezen ("import java.io.*", "import java.util.*", enz.).

    Er wordt een tweede ontwerp van de Class-File API voorgesteld 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); } } });

  • Dit is de achtste voorlopige implementatie van de Vector API, die functies biedt voor vectorberekeningen die worden uitgevoerd met behulp van de vectorinstructies van de x86_64- en AArch64-processoren en waarmee bewerkingen op meerdere waarden tegelijk kunnen worden toegepast (SIMD). In tegenstelling tot de automatische vectorisatie van scalaire bewerkingen door de HotSpot JIT-compiler, biedt de nieuwe API de mogelijkheid om vectorisatie voor parallelle gegevensverwerking expliciet te beheren.
  • De klasse java.io.Console is bijgewerkt met de methoden format, printf, readPassword en readLine voor het formatteren, weergeven en lezen van tekst op basis van de geselecteerde landinstellingen. System.console().printf(Locale.FRANCE, "%1$tY-%1$tB-%1$te %1$tA", new Date()) 2024-mai-16 jeudi
  • Er is een tweede preview toegevoegd van de uitgebreide Stream API die het definiëren van aangepaste tussenbewerkingen ondersteunt, wat handig kan zijn in gevallen waarin de bestaande ingebouwde tussenbewerkingen onvoldoende zijn voor de gewenste datatransformatie. Aangepaste handlers worden gekoppeld met een nieuwe tussenbewerking Stream::gather(Gatherer), die de elementen van de stream verwerkt door er een door de gebruiker gedefinieerde handler op toe te passen. 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]]
  • Er is een derde voorlopige implementatie toegevoegd van impliciet gedeclareerde klassen en naamloze instanties van de "main"-methode, die zonder public/static-declaraties kan werken en een array met argumenten en andere entiteiten die aan de klassendeclaratie zijn gekoppeld, kan doorgeven. // was public class HelloWorld { public static void main(String[] args) { System.out.println("Hallo wereld!"); } } // nu kunt u void main() { System.out.println("Hallo, Wereld!"); }
  • Een tweede ontwerp toegevoegd van een functie waarmee constructeurs expressies kunnen specificeren voordat ze super(…) aanroepen om expliciet een constructor van een bovenliggende klasse aan te roepen vanuit een constructor van een afgeleide klasse, zolang die expressies niet verwijzen naar het exemplaar dat door de constructor wordt gemaakt. class Outer { void hello() { System.out.println("Hello"); } class Inner { Inner() { hello(); super(); } } }
  • Er is een derde voorlopige implementatie van Scoped Values ​​toegevoegd, waardoor onveranderlijke gegevens tussen threads kunnen worden gedeeld en gegevens efficiënt kunnen worden uitgewisseld tussen onderliggende threads (waarden worden geërfd). Scoped Values ​​worden ontwikkeld om het mechanisme met thread-lokale variabelen te vervangen en zijn efficiënter bij het gebruik van zeer grote aantallen virtuele threads (duizenden en miljoenen threads). Het belangrijkste verschil tussen Scoped Values ​​en thread-lokale variabelen is dat de eerste eenmalig worden geschreven, later niet kunnen worden gewijzigd en alleen beschikbaar blijven gedurende de uitvoering van de thread.
  • Er is een derde versie van de Structured Concurrency API vrijgegeven voor testen. Deze versie vereenvoudigt de ontwikkeling van multithreaded applicaties door meerdere taken die op verschillende threads worden uitgevoerd als één eenheid te behandelen.
  • De methoden voor toegang tot extern (buiten de JVM) geheugen die door de klasse sun.misc.Unsafe worden aangeboden, zijn verouderd en zullen worden verwijderd. Het wordt aanbevolen om de VarHandle API en de FFM (Foreign Function & Memory) API te gebruiken om toegang te krijgen tot off-heap geheugen en om met externe code te communiceren.

Daarnaast kunnen we de publicatie van een update voor het platform voor het maken van applicaties met een grafische interface JavaFX 23 en de opname van de GraalVM JIT-compiler in de belangrijkste Oracle JDK 23 melden.

Er wordt ook een nieuwe release van de universele virtuele machine GraalVM gepresenteerd, die de lancering van applicaties in JavaScript (Node.js), Python, Ruby, R, alle talen voor de JVM (Java, Scala, Clojure, Kotlin) en talen waarvoor LLVM-bitcode kan worden gegenereerd (C, C++, Rust) ondersteunt. Naast ondersteuning voor JDK 23 optimaliseert de nieuwe versie het geheugengebruik en de grootte van de uitvoerbare code, en implementeert volledige ondersteuning voor tools voor het integreren van Python en WebAssembly in Java-code met behulp van JIT-compilatie.

Bron: opennet.ru

Voeg een reactie