Release van het Java SE 22-platform en OpenJDK 22 open referentie-implementatie

Na zes maanden ontwikkeling heeft Oracle Java SE 22 (Java Platform, Standard Edition 22) uitgebracht, dat het OpenJDK open source-project als referentie-implementatie gebruikt. Met uitzondering van de verwijdering van enkele verouderde functies, behoudt Java SE 22 achterwaartse compatibiliteit met eerdere releases van het Java-platform - de meeste eerder geschreven Java-projecten werken nog steeds zonder aanpassingen wanneer ze onder de nieuwe versie worden uitgevoerd. Installeerbare builds van Java SE 22 (JDK, JRE en Server JRE) zijn voorbereid voor Linux (x86_64, AArch64), Windows (x86_64) en macOS (x86_64, AArch64). De Java 22-referentie-implementatie, ontwikkeld door het OpenJDK-project, is volledig open onder de GPLv2-licentie met GNU ClassPath-uitzonderingen om dynamische koppelingen met commerciële producten mogelijk te maken.

Java SE 22 is geclassificeerd als een reguliere ondersteuningsrelease en zal updates blijven ontvangen tot de volgende release. De Long Term Support (LTS)-tak moet Java SE 21 of Java SE 17 zijn, die respectievelijk tot 2031 en 2029 updates zullen ontvangen (algemeen beschikbaar tot 2028 en 2026). De publieke steun voor de LTS-tak van Java SE 11 eindigde afgelopen september, maar de uitgebreide ondersteuning zal doorgaan tot 2032. Uitgebreide ondersteuning voor de LTS-tak van Java SE 8 loopt door tot 2030.

Laten we u eraan herinneren dat het project vanaf de release van Java 10 is overgestapt op een nieuw ontwikkelingsproces, wat een kortere cyclus voor de vorming van nieuwe releases inhield. Nieuwe functionaliteit wordt nu ontwikkeld in één voortdurend bijgewerkte masterbranch, die kant-en-klare wijzigingen bevat en waaruit elke zes maanden branches worden vertakt om nieuwe releases te stabiliseren.

Nieuwe functies in Java 22 zijn onder andere:

  • De G1-garbagecollector biedt ondersteuning voor het vastzetten van regio's, waarmee u tijdelijk de locatie van Java-objecten in het geheugen kunt vastleggen om te voorkomen dat ze door de garbage collector worden verplaatst en om verwijzingen naar deze objecten veilig tussen Java en de native code te kunnen doorgeven. Met vastzetten kunt u de latentie verminderen en voorkomen dat u garbagecollection uitschakelt bij het uitvoeren van kritieke regio's van JNI (Java Native Interface) met native code (tijdens het uitvoeren van deze secties mag de JVM geen kritieke objecten verplaatsen die eraan zijn gekoppeld om race-omstandigheden te voorkomen). Door het vastzetten worden kritische objecten uit het zicht van de garbage collector verwijderd, die niet-vastgezette gebieden kan blijven opruimen.
  • Er is een voorlopige functie toegevoegd waarmee expressies kunnen worden gespecificeerd in constructors voordat super(...) wordt aangeroepen. Deze wordt gebruikt om expliciet een bovenliggende klasseconstructor aan te roepen vanuit een overgeërfde klasseconstructor als die expressies niet verwijzen naar een instantie die door de constructor is gemaakt. class Outer { void hallo() { System.out.println("Hallo"); } klasse Inner { Inner() { hallo(); super(); } } }
  • De FFM-API (Foreign Function & Memory) is gestabiliseerd, waardoor interactie van Java-programma's met externe code en gegevens mogelijk is door functies uit externe bibliotheken aan te roepen en toegang te krijgen tot geheugen buiten de JVM, zonder gebruik te hoeven maken van JNI (Java Native Interface).
  • Ondersteuning voor naamloze variabelen en patroonmatching is ingeschakeld - in plaats van ongebruikte maar noodzakelijke variabelen en patronen bij het aanroepen, kunt u nu het teken "_" opgeven. // was String pageName = switch (pagina) { case GitHubIssuePage(var url, var content, var links, int issueNumber) -> “ISSUE #” + issueNumber; ... }; // nu kun je String pageName = switch (pagina) { case GitHubIssuePage(_, _, _, int issueNumber) -> “ISSUE #” + issueNumber; };
  • Er wordt een voorlopige implementatie van de Class-File API voorgesteld voor het parseren, genereren en converteren 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); } } });
  • Het Java-hulpprogramma biedt de mogelijkheid om Java-programma's uit te voeren, geleverd in de vorm van verschillende codebestanden of vooraf gecompileerde klassenbibliotheken, zonder deze bestanden afzonderlijk te compileren en zonder het bouwsysteem te configureren. De nieuwe functie maakt het eenvoudiger om programma's uit te voeren waarin de code van verschillende klassen in afzonderlijke bestanden is gescheiden. Prog.java: klasse Prog { public static void main(String[] args) { Helper.run(); } } Helper.java: class Helper { static void run() { System.out.println("Hallo!"); } }

    Om bijvoorbeeld een programma uit te voeren dat bestaat uit twee bestanden "Prog.java" en "Helper.java", is het nu voldoende om "java Prog.java" uit te voeren, dat de Prog-klasse compileert en een verwijzing naar de Helper-klasse definieert, zoek en compileer het Helper-bestand .java en roep de hoofdmethode aan.

  • Een tweede voorlopige implementatie van String-sjablonen toegevoegd, geïmplementeerd naast letterlijke tekenreeksen en tekstblokken. Met tekenreekssjablonen kunt u tekst combineren met berekende uitdrukkingen en variabelen zonder de operator + te gebruiken. Vervanging van expressies wordt uitgevoerd met behulp van vervangingen \{..}, en er kunnen speciale handlers worden aangesloten om de juistheid van de vervangen waarden te controleren. De SQL-engine controleert bijvoorbeeld de waarden die in de SQL-code worden vervangen en retourneert een java.sql.Statement-object als uitvoer, terwijl de JSON-processor de juistheid van de JSON-vervangingen bewaakt en een JsonNode retourneert. String query = "SELECT * VAN Persoon p WAAR p." + eigenschap + " = '" + waarde + "'"; // was Statement query = SQL."""SELECT * FROM Person p WHERE p.\{property} = '\{value}'"""; // werd
  • Er is een zevende preview van de Vector API toegevoegd, die functies biedt voor vectorberekeningen die worden uitgevoerd met behulp van vectorinstructies op x86_64- en AArch64-processors en waarmee bewerkingen tegelijkertijd op meerdere waarden kunnen worden toegepast (SIMD). In tegenstelling tot de mogelijkheden van de HotSpot JIT-compiler voor automatische vectorisatie van scalaire bewerkingen, maakt de nieuwe API het mogelijk om vectorisatie expliciet te controleren voor parallelle gegevensverwerking.
  • Er is een voorlopige implementatie van de uitgebreide Stream API toegevoegd die het definiëren van uw eigen tussenliggende bewerkingen ondersteunt, wat handig kan zijn in gevallen waarin bestaande ingebouwde tussenliggende bewerkingen niet voldoende zijn voor de gewenste gegevenstransformatie. Native handlers zijn verbonden met behulp van de nieuwe tussenliggende bewerking Stream::gather(Gatherer), die stroomelementen verwerkt door er een door de gebruiker opgegeven 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]]
  • Om te testen is een tweede versie van de experimentele API voor gestructureerde gelijktijdigheid voorgesteld, die de ontwikkeling van applicaties met meerdere threads vereenvoudigt door meerdere taken die in verschillende threads worden uitgevoerd als één blok te verwerken.
  • Een tweede voorlopige implementatie toegevoegd van impliciet gedeclareerde klassen en naamloze instanties van de "main"-methode, die kan afzien van publieke/statische declaraties, het doorgeven van een reeks argumenten en andere entiteiten die zijn gekoppeld aan een klassedeclaratie. // was public class HelloWorld { public static void main(String[] args) { System.out.println("Hallo wereld!"); } } // nu kun je main() { System.out.println("Hallo wereld!"); }
  • Een tweede preview-implementatie van Scoped Values ​​toegevoegd, waardoor onveranderlijke gegevens kunnen worden gedeeld tussen threads en gegevens efficiënt kunnen worden uitgewisseld tussen onderliggende threads (waarden worden overgenomen). Scoped Values ​​worden ontwikkeld om het thread-local variabelen-mechanisme te vervangen en zijn efficiënter bij het gebruik van zeer grote aantallen virtuele threads (duizenden of miljoenen threads). Het belangrijkste verschil tussen Scoped Values ​​en lokale threadvariabelen is dat de eerste één keer worden geschreven, in de toekomst niet kunnen worden gewijzigd en alleen beschikbaar blijven voor de duur van de uitvoering van de thread.
  • De Parallelle garbage collector heeft verbeterde prestaties bij het werken met grote reeksen objecten. Optimalisatie maakte het in sommige tests met grote reeksen objecten mogelijk om de vertraging voordat het zoeken naar een object begon met 20% te verminderen.

Bovendien kunt u de publicatie noteren van een update van het platform voor het maken van applicaties met een grafische interface JavaFX 22.

Bron: opennet.ru

Voeg een reactie