Udgivelse af Java SE 24 og OpenJDK 24

Efter seks måneders udvikling har Oracle offentliggjort Java SE 24 (Java Platform, Standard Edition 24), hvor det åbne projekt OpenJDK anvendes som referenceimplementering. Bortset fra fjernelse af nogle forældede funktioner opretholder Java SE 24 bagudkompatibilitet med tidligere versioner af Java-platformen — de fleste eksisterende Java-projekter vil fungere uden ændringer under den nye version. Klargjorte installationspakker af Java SE 24 (JDK, JRE og Server JRE) er forberedt til Linux (x86_64, AArch64), Windows (x86_64) og macOS (x86_64, AArch64). Den referenceimplementering af Java SE 24, der er udviklet under OpenJDK-projektet, er fuldstændig åbent under GPLv2-licensen med undtagelser fra GNU ClassPath, der tillader dynamisk linking til kommercielle produkter.

Java SE 24 klassificeres som en version med almindelig support, og opdateringer vil blive udgivet indtil næste release. For en langvarig supportgren (LTS) bør Java SE 21 eller Java SE 17 bruges, opdateringer til disse vil blive udgivet indtil henholdsvis 2031 og 2029 (offentlige — indtil 2028 og 2026). Den udvidede support for LTS-grenen Java SE 8 vil vare frem til 2030, mens Java SE 11 vil være tilgængelig indtil 2032. Den næste LTS-udgivelse bliver efterårsudgivelsen af Java SE 25.

Blandt de nye funktioner i Java SE 24:

  • Den eksperimentelle generative tilstand for affaldsindsamleren Shenandoah er foreslået, hvor gamle og nyligt oprettede objekter behandles separat for at forbedre effektiviteten af oprydning af objekter med kort levetid. Den nye tilstand sikrer mere forudsigelig gennemstrømning, modstand mod belastningsændringer og lavere hukommelsesforbrug under affaldsindsamling. Shenadoahs planlægger sigter mod at reducere stop tider under affaldsindsamling ved at udføre et større volumen arbejde parallelt med kørsel af Java-applikationer.
  • I HotSpot JVM er der implementeret eksperimentel støtte til kompakte objektoverskrifter, hvis størrelse på 64-bit systemer er reduceret fra 96 til 64 bit (fra 12 til 8 byte). Den reducerede headerstørrelse gør det muligt at forkorte heap-størrelsen og øge cache-effektiviteten.
  • I G1-møtrik er implementeringen af barrierer, der sporer applikationens adgang til hukommelsen, forenklet. I den nye version er barrierens udvidelsesoperationer flyttet til et senere trin i kompileringen i C2 JIT. Udførte tests viser, at en sådan flytning kan reducere overheaden i C2 JIT-kompilatoren med 10-20% afhængigt af applikationen.
  • Der er tilføjet en API til brug af kryptografiske funktioner til dannelse af nøgler (KDF, key derivation function), som gør det muligt at generere yderligere nøgler af den nødvendige længde baseret på en hemmelig nøgle (f.eks. et kodeord) og en vilkårlig datasæt. KDF API'en har indtil videre status som preview.
  • Muligheden for præ-load (Ahead-of-Time) af klasser er blevet tilføjet. Ændringen gør det muligt at fremskynde opstarten af HotSpot JVM ved at levere de klasser, der anvendes i applikationen, i en allerede indlæst og komprimeret tilstand. Ved den første opstart af applikationen nulstilles tilstanden af alle klasser til cache, og ved efterfølgende opstarter bruges den til at fremskynde indlæsningen.
  • Der er tilføjet en Class-File API til at 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 instanceof MethodModel mm && mm.methodName().stringValue().startsWith("debug"))) { classBuilder.with(ce); } } });

  • Der er tilføjet en udvidet Stream API, der understøtter definitionen af egne mellemoperationer, som kan være nyttige i tilfælde, hvor de eksisterende indbyggede mellemoperationer ikke er tilstrækkelige til den ønskede datatransformation. Egen håndteringer tilføjes ved hjælp af en ny mellemoperation Stream::gather(Gatherer), som behandler streamens elementer ved at anvende en brugerdefineret håndteringsfunktion. 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]]
  • Den fjerde foreløbige implementering af Scoped Values er blevet foreslået, hvilket muliggør deling af immutable data i tråde og effektivt databyte mellem børnetråde (værdierne arves). Scoped Values udvikles til at erstatte mekanismen for trådlokale variabler og er mere effektive ved brug af et stort antal virtuelle tråde (tusinder og millioner af tråde). Den primære forskel mellem Scoped Values og trådlokale variabler er, at de første kun kan skrives én gang, ikke kan ændres og kun er tilgængelige under trådens køretid.
  • Der er tilføjet foreløbig understøttelse af brugen af primitive typer (int, byte, char og andre grundlæggende typer, der ikke er objekter) i alle former for skabeloner, i "instanceof" operatoren og i "switch" blokke. switch (x.getStatus()) { case 0 -> "okay"; case 1 -> "warning"; case 2 -> "error"; case int i -> "ukendt status: " + i; } if (i instanceof byte b) { … b … }
  • Den niende foreløbige implementering af API Vector er blevet foreslået, hvilket giver funktioner til vektorberegninger, der udføres ved hjælp af vektor instruktioner fra x86_64 og AArch64 processorer og muliggør samtidig anvendelse af operationer på flere værdier (SIMD). I modsætning til mulighederne for automatisk vektorisering af skalaroperationer, der leveres af HotSpot JIT-kompilatoren, giver det nye API mulighed for eksplicit kontrol over vektoriseringen til paralleldatabehandling.
  • Understøttelse af synkronisering af virtuelle tråde uden at knytte dem (pinning) til platformforbundne tråde er blevet implementeret. Virtuelle tråde i en synkroniseret metode eller udtryk i en låst tilstand frigiver nu deres platformtråd, hvilket gør det muligt for andre virtuelle tråde at bruge den, hvilket betydeligt øger antallet af tilgængelige virtuelle tråde og forbedrer skalerbarheden af ​​applikationer, der bruger multitrådning.
  • En tredje foreløbig variant er blevet tilføjet, som tillader angivelse i udtrykskonstruktører før kaldet til super(…), der bruges til eksplicit at kalde konstruktøren for forældreklassen fra konstruktøren af arvet klassen, hvis disse udtryk ikke henviser til den instans, der skabes af konstruktøren. class Outer { void hello() { System.out.println("Hello"); } class Inner { Inner() { hello(); super(); } } }
  • I jlink-værktøjet er der implementeret støtte til at oprette runtime-billeder uden brug af JMOD-filer, hvilket gør det muligt at reducere størrelsen af JDK med cirka 25%.
  • En anden foreløbig variant af udtrykket "import module M" er blevet tilføjet til at importere alle pakker, der eksporteres af den angivne module. Denne ændring forenkler betydeligt genbrug af modulbiblioteker, da det nu er muligt at tilslutte biblioteker og klasser uden at specificere deres placering i pakkehierarkiet. For eksempel vil angivelsen "import module java.base" føre til import af alle 54 pakker, der er en del af module java.base, som tidligere skulle nævnes individuelt ("import java.io.*", "import java.util.*" osv.).
  • En fjerde foreløbig implementering af implicit erklærede klasser og anonym instanser af metoden "main" er blevet tilføjet, hvor det er muligt at undvære erklæringerne public/static, overførsel af argumentarrays og andre enheder, der relaterer sig til klasseerklæring. // tidligere public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } // nu kan man void main() { System.out.println("Hello, World!"); }
  • Den fjerde foreløbige variant af API'en til struktureret parallelisme (Structured Concurrency) er blevet foreslået til testning, hvilket forenkler udviklingen af multitrådede applikationer ved at behandle flere opgaver, der udføres i forskellige tråde, som en enkelt blok.
  • I API'en KeyPairGenerator, Signature og KeyFactory er der tilføjet støtte til algoritmerne ML-KEM (CRYSTALS-Kyber) og ML-DSA (CRYSTALS-Dilithium), standardiseret af det amerikanske National Institute of Standards and Technology (NIST) og modstandsdygtige over for brute-force angreb på kvantecomputere. Disse algoritmer anvender kryptografiske metoder baseret på løsninger af gitterteoretiske problemer, hvor løsningen ikke varierer mellem klassiske og kvantecomputere.
  • I ZGC-samleren er support for den ikke-generative driftsmode, der ikke adskiller behandlingen af "gamle" og "unge" objekter, blevet fjernet. Fra og med Java SE 23 anvendes den generative mode for ZGC som standard.
  • Der er tilføjet advarsler om brug af JNI (Java Native Interface) og FFM (Foreign Function & Memory) API'er for at forberede udviklerne på begrænsningen af adgangen til disse API'er i et af de kommende udgivelser, der som standard vil forhindre interaktion med native kode.
  • Der er aktiveret en advarsel, når der anvendes metoder til adgang til ekstern hukommelse (uden for JVM), der leveres af klassen sun.misc.Unsafe. For at få adgang til hukommelse uden for heap'en (off-heap) og interagere med ekstern kode anbefales det at bruge VarHandle API'et. I den tidligere udgivelse blev supporten for sun.misc.Unsafe erklæret som forældet.
  • Security Manager, der længe har været forældet og udtjent efter ophævelsen af supporten for browser-plugins, er blevet deaktiveret. Security Manager blev erklæret som forældet i Java 17. Koden for Security Manager er planlagt til at blive fjernet helt i en af de kommende udgivelser.
  • Koden for at understøtte 32-bit platformen Windows på x86-systemer er blevet fjernet. Porten til Java for 32-bit systemer x86 er blevet erklæret som forældet og planlagt til at blive fjernet (supporten for Linux på 32-bit x86 systemer vil blive ophørt).

Derudover kan det nævnes, at opdateringen af platformen til udvikling af applikationer med grafisk brugerflade JavaFX 24 og den nye udgivelse af GraalVM, som understøtter kørsel af applikationer på JavaScript (Node.js), Python, Ruby, R, hvilke som helst sprog for JVM (Java, Scala, Clojure, Kotlin) samt sprog, der kan generere LLVM-bitcode (C, C++, Rust), er blevet udgivet. Udover support for JDK 24 er der også optimeringer til maskinlæring opgaver, forbedret support for kompilering af Java bytecode til maskinkode, og en mekanisme kaldet SkipFlow er blevet tilføjet for at reducere størrelsen af de eksekverbare filer og forkorte kompileringstiden.

Kilde: opennet.ru

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster