Utgivelse av Java SE 22-plattform og OpenJDK 22 åpen referanseimplementering

Etter seks måneder med utvikling, ga Oracle ut Java SE 22 (Java Platform, Standard Edition 22), som bruker OpenJDK åpen kildekode-prosjektet som referanseimplementering. Med unntak av fjerning av noen foreldede funksjoner, opprettholder Java SE 22 bakoverkompatibilitet med tidligere utgivelser av Java-plattformen - de fleste tidligere skrevne Java-prosjekter vil fungere uten endringer når de kjøres under den nye versjonen. Klar til å installere bygg av Java SE 22 (JDK, JRE og Server JRE) er forberedt for Linux (x86_64, AArch64), Windows (x86_64) og macOS (x86_64, AArch64). Java 22-referanseimplementeringen er utviklet av OpenJDK-prosjektet og er fullstendig åpen kildekode under GPLv2-lisensen, med GNU ClassPath-unntak som tillater dynamisk kobling med kommersielle produkter.

Java SE 22 er klassifisert som en vanlig støtteutgivelse og vil fortsette å motta oppdateringer til neste utgivelse. Long Term Support (LTS)-grenen bør være Java SE 21 eller Java SE 17, som vil motta oppdateringer frem til henholdsvis 2031 og 2029 (vanligvis tilgjengelig til 2028 og 2026). Offentlig støtte for LTS-grenen til Java SE 11 ble avsluttet i september i fjor, men utvidet støtte vil fortsette til 2032. Utvidet støtte for LTS-grenen til Java SE 8 vil fortsette til 2030.

La oss minne deg på at fra og med utgivelsen av Java 10, gikk prosjektet over til en ny utviklingsprosess, noe som innebar en kortere syklus for dannelsen av nye utgivelser. Ny funksjonalitet utvikles nå i én konstant oppdatert hovedgren, som inkluderer ferdige endringer og hvor grener forgrenes hvert halvår for å stabilisere nye utgivelser.

Nye funksjoner i Java 22 inkluderer:

  • G1-søppelsamleren inkluderer støtte for region-pinning, som lar deg midlertidig fikse plasseringen til Java-objekter i minnet for å unngå at de flyttes av søppelsamleren og for å tillate at referanser til disse objektene kan overføres trygt mellom Java og opprinnelig kode. Festing lar deg redusere ventetiden og unngå å deaktivere søppelinnsamling når du kjører kritiske områder av JNI (Java Native Interface) med innebygd kode (mens du kjører disse seksjonene, bør JVM ikke flytte kritiske objekter knyttet til dem for å unngå raseforhold). Festing fjerner kritiske gjenstander fra søppeloppsamleren, som kan fortsette å rydde opp områder som ikke er festet.
  • En foreløpig funksjon er lagt til for å tillate at uttrykk spesifiseres i konstruktører før super(...), brukes til å eksplisitt kalle en overordnet klassekonstruktør fra en arvet klassekonstruktør hvis disse uttrykkene ikke refererer til en forekomst opprettet av konstruktøren. klasse Ytre { void hello() { System.out.println("Hei"); } klasse Indre { Indre() { hallo(); super(); } } }
  • FFM (Foreign Function & Memory) API har blitt stabilisert, og tillater interaksjon av Java-programmer med ekstern kode og data ved å kalle opp funksjoner fra eksterne biblioteker og få tilgang til minne utenfor JVM, uten å ty til å bruke JNI (Java Native Interface).
  • Støtte for navnløse variabler og mønstertilpasning er aktivert - i stedet for ubrukte men nødvendige variabler og mønstre når du ringer, kan du nå spesifisere tegnet "_". // was String pageName = switch (page) { case GitHubIssuePage(var url, var content, var links, int issueNumber) -> “ISSUE #” + issueNumber; ... }; // nå kan du String sidenavn = bytte (side) { case GitHubIssuePage(_, _, _, int issueNumber) -> “ISSUE #” + issueNumber; };
  • En foreløpig implementering av Class-File API er foreslått for å analysere, generere og konvertere Java-klassefiler. ClassFile cf = ClassFile.of(); ClassModel classModel = cf.parse(bytes); byte[] newBytes = cf.build(classModel.thisClass().asSymbol(), classBuilder -> { for (ClassElement ce : classModel) { if (!(ce forekomst av MethodModel mm && mm.methodName().stringValue(). startsWith("debug"))) { classBuilder.with(ce);
  • Java-verktøyet gir muligheten til å kjøre Java-programmer, levert i form av flere kodefiler eller forhåndskompilerte klassebiblioteker, uten å kompilere disse filene separat og uten å konfigurere byggesystemet. Den nye funksjonen gjør det enklere å kjøre programmer der koden til forskjellige klasser er delt opp i separate filer. Prog.java: class Prog { public static void main(String[] args) { Helper.run(); } } Helper.java: class Helper { static void run() { System.out.println("Hei!"); } }

    For eksempel, for å kjøre et program som består av to filer "Prog.java" og "Helper.java" er det nå tilstrekkelig å kjøre "java Prog.java", som vil kompilere Prog-klassen, definere en referanse til Helper-klassen, finn og kompiler hjelpefilen java og kall opp hovedmetoden.

  • Lagt til en andre foreløpig implementering av strengmaler, implementert i tillegg til strengbokstaver og tekstblokker. Strengmaler lar deg kombinere tekst med beregnede uttrykk og variabler uten å bruke +-operatoren. Substitusjon av uttrykk utføres ved hjelp av substitusjoner \{..}, og spesielle behandlere kan kobles til for å kontrollere riktigheten av de substituerte verdiene. For eksempel sjekker SQL-motoren verdiene som erstattes i SQL-koden og returnerer et java.sql.Statement-objekt som utdata, mens JSON-prosessoren overvåker riktigheten av JSON-erstatningene og returnerer en JsonNode. String query = "SELECT * FROM Person p WHERE p." + eiendom + " = '" + verdi + "'"; // was Statement query = SQL."""SELECT * FROM Person p WHERE p.\{property} = '\{verdi}'""""; // ble til
  • En syvende forhåndsvisning av Vector API er lagt til, og gir funksjoner for vektorberegninger som utføres ved hjelp av vektorinstruksjoner på x86_64- og AArch64-prosessorer og lar operasjoner brukes samtidig på flere verdier (SIMD). I motsetning til mulighetene gitt i HotSpot JIT-kompilatoren for autovektorisering av skalaroperasjoner, gjør det nye API-et det mulig å eksplisitt kontrollere vektorisering for parallell databehandling.
  • Det er lagt til en foreløpig implementering av det utvidede Stream API som støtter å definere dine egne mellomoperasjoner, noe som kan være nyttig i tilfeller der eksisterende innebygde mellomoperasjoner ikke er tilstrekkelig for ønsket datatransformasjon. Innfødte behandlere kobles til ved hjelp av den nye mellomoperasjonen Stream::gather(Gatherer), som behandler strømelementer ved å bruke en brukerspesifisert behandler på dem. 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]]
  • En andre versjon av det eksperimentelle API for Structured Concurrency har blitt foreslått for testing, som forenkler utviklingen av flertrådede applikasjoner ved å behandle flere oppgaver utført i forskjellige tråder som en enkelt blokk.
  • Lagt til en andre foreløpig implementering av implisitt deklarerte klasser og ikke navngitte forekomster av "hoved"-metoden, som kan unnlate offentlige/statiske erklæringer, sende en rekke argumenter og andre enheter knyttet til en klasseerklæring. // var offentlig klasse HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } // nå kan du annullere main() { System.out.println("Hei, verden!"); }
  • La til en andre forhåndsvisningsimplementering av Scoped Values, slik at uforanderlige data kan deles på tvers av tråder og data utveksles effektivt mellom underordnede tråder (verdier arves). Scoped Values ​​blir utviklet for å erstatte tråd-lokale variabler-mekanismen og er mer effektive når du bruker svært store antall virtuelle tråder (tusenvis eller millioner av tråder). Hovedforskjellen mellom Scoped Values ​​og trådlokale variabler er at de førstnevnte er skrevet én gang, ikke kan endres i fremtiden, og forblir bare tilgjengelige så lenge tråden kjøres.
  • Den parallelle søppeloppsamleren har forbedret ytelse når du arbeider med store gjenstander. Optimalisering gjorde det mulig i noen tester med store arrays av objekter å redusere forsinkelsen før man begynte å søke etter et objekt med 20 %.

I tillegg kan du legge merke til publiseringen av en oppdatering til plattformen for å lage applikasjoner med et grafisk grensesnitt JavaFX 22.

Kilde: opennet.ru

Legg til en kommentar