Po šesti měsících vývoje společnost Oracle zveřejnila platformu Java SE 24 (Java Platform, Standard Edition 24), jejíž referenční implementací je otevřený projekt OpenJDK. Kromě odstranění některých zastaralých funkcí je v Java SE 24 zachována zpětná kompatibilita s předchozími verzemi platformy Java — většina dříve napsaných Java projektů bude bez jakýchkoliv úprav funkční na nové verzi. Připravené k instalaci balíčky Java SE 24 (JDK, JRE a Server JRE) jsou dostupné pro Linux (x86_64, AArch64), Windows (x86_64) a macOS (x86_64, AArch64). Referenční implementace Java SE 24 vyvinutá v rámci projektu OpenJDK je zcela otevřená pod licencí GPLv2 s výjimkami GNU ClassPath, které umožňují dynamické spojení s komerčními produkty.
Java SE 24 je zařazena do kategorie verzí s běžnou dobou podpory, aktualizace budou vydávány až do dalšího releasu. Pro dlouhodobou podporu (LTS) je doporučeno používat Java SE 21 nebo Java SE 17, jejichž aktualizace budou vydávány do let 2031 a 2029 (veřejné — do let 2028 a 2026). Rozšířená podpora LTS větve Java SE 8 potrvá do roku 2030 a Java SE 11 do roku 2032. Dalším LTS releasem bude podzimní vydání Java SE 25.
Mezi novinkami představovanými v Java SE 24 patří:
- Byl navržen experimentální generativní režim práce s garbage collectorem Shenandoah, při kterém se odděleně zpracovávají staré a nově vytvořené objekty pro zvýšení efektivity čištění objektů s krátkou životností. Nový režim zajišťuje předvídatelnější propustnost, odolnost vůči změnám zátěže a snížení spotřeby paměti při sběru odpadu. Plánovač Shenandoah se zaměřuje na zkrácení doby přerušení během sběru odpadu tím, že provádí větší objem práce paralelně s běžícími Java aplikacemi.
- V HotSpot JVM byla implementována experimentální podpora kompaktních hlaviček objektů, jejichž velikost byla na 64bitových systémech zmenšena z 96 na 64 bitů (z 12 na 8 bytů). Zmenšení velikosti hlaviček umožňuje zkrátit velikost haldy a zvýšit efektivitu práce cache.
- V G1 garbage collectoru byla zjednodušená implementace bariér, které sledují přístup aplikace k paměti. V nové verzi byly operace rozšíření bariér přesunuty na pozdější fázi kompilace v C2 JIT. Provedené testy ukazují, že tento přesun umožňuje snížit režijní náklady v JIT kompilátoru C2 o 10-20 % v závislosti na aplikaci.
- Bylo přidáno API pro použití kryptografických funkcí pro odvození klíče (KDF, key derivation function), které umožňují vytvořit další klíče požadované délky na základě tajného klíče (například hesla) a libovolné množiny dat. KDF API má prozatím status předběžného (preview).
- Byla přidána možnost předběžného (Ahead-of-Time) načítání a kompilace tříd. Tato změna umožňuje zrychlit spouštění HotSpot JVM tím, že poskytuje třídy používané v aplikaci ve již načteném a zkompilovaném stavu. Při prvním spuštění aplikace se stav všech tříd ukládá do cache a při následných spuštěních se využívá pro urychlení načítání.
- Bylo přidáno API Class-File pro analýzu, generaci a transformaci souborů s třídami Java.
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); } } });
- Bylo přidáno rozšířené API Stream, které podporuje definici vlastních mezioperací, které mohou být užitečné v případech, kdy stávající integrované mezioperace nejsou dostatečné pro požadovanou transformaci dat. Vlastní zpracovatelé se připojují pomocí nové mezioperace Stream::gather(Gatherer), která zpracovává prvky proudu a aplikuje na ně uživatelsky definovaný zpracovatel. 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]]
- Byla navržena čtvrtá předběžná implementace omezených hodnot (Scoped Values), která umožňuje sdílení neměnných dat v průnicích a efektivní výměnu dat mezi podřízenými průniky (hodnoty jsou zděděny). Scoped Values se vyvíjí jako náhrada mechanismu lokálních proměnných k průniku (thread-local variables) a jsou efektivnější při použití velmi velkého počtu virtuálních průniků (tisíce a miliony průniků). Hlavní rozdíl mezi Scoped Values a lokálními proměnnými k průniku spočívá v tom, že první se zapisují jednou, následně nemohou být měněny a zůstávají dostupné pouze po dobu vyřizování průniku.
- Do mechanismů pro vzorové přiřazení byla přidána předběžná podpora pro použití primitivních typů (int, byte, char a další základní typy, které nejsou objekty) ve všech typech šablon, v operátoru „instanceof“ a v blocích „switch“. switch (x.getStatus()) { case 0 -> „okay“; case 1 -> „warning“; case 2 -> „error“; case int i -> „unknown status: “ + i; } if (i instanceof byte b) { … b … }
- Byla navržena devátá předběžná implementace API Vector, která poskytuje funkce pro vektorové výpočty, jež se provádějí pomocí vektorových instrukcí procesorů x86_64 a AArch64 a umožňují souběžně aplikovat operace na několik hodnot (SIMD). Na rozdíl od možností auto-véktorování skalarových operací poskytovaných v JIT kompilátoru HotSpot, nové API umožňuje explicitně řídit vektorování pro paralelní zpracování dat.
- Byla implementována podpora synchronizace virtuálních průniků bez jejich přiřazení (pinning) k průnikům spojeným s platformou. Virtuální průniky v synchronizované metodě nebo výrazu ve stavu blokace nyní uvolňují svůj platformový průnik, čímž umožňují jiným virtuálním průnikům jeho využití, což výrazně zvyšuje počet dostupných virtuálních průniků a zlepšuje škálovatelnost aplikací využívajících víceúloh.
- Byl přidán třetí předběžný variant funkce, která umožňuje uvedení v konstruktoru výrazů před voláním super(…), používaného k explicitnímu volání konstruktoru nadřazené třídy z konstruktoru děděné třídy, pokud se tyto výrazy neodkazují na instanci vytvářenou konstruktoru. class Outer { void hello() { System.out.println("Ahoj"); } class Inner { Inner() { hello(); super(); } } }
- Nástroj jlink zavedl podporu pro vytváření run-time obrazů bez použití souborů JMOD, což umožňuje snížit velikost JDK o přibližně 25 %.
- Byl přidán druhý předběžný variant použití jednoho výrazu „import module M“ pro import všech balíčků, které daný modul exportuje. Tato změna výrazně usnadňuje opětovné použití modulových knihoven, umožňuje připojit knihovny a třídy bez určování jejich umístění v hierarchii balíčků. Například uvedení „import module java.base“ povede k importu všech 54 balíčků, které patří do modulu java.base, jež by předtím bylo nutné uvádět jednotlivě („import java.io.*“, „import java.util.*“ atd.).
- Byla přidána čtvrtá předběžná realizace neexplicitně deklarovaných tříd a anonymních instancí metody „main“, ve kterých se lze obejít bez deklarací public/static, předávání pole argumentů a dalších entit souvisejících s deklarací třídy. \/\/ dříve public class HelloWorld { public static void main(String[] args) { System.out.println("Ahoj světe!"); } } \/\/ nyní lze void main() { System.out.println("Ahoj, světe!"); }
- Byl navržen k testování čtvrtý předběžný variant API pro strukturovanou paralelnost (Structured Concurrency), který usnadňuje vývoj vícethreadových aplikací prostřednictvím zpracování několika úloh prováděných v různých vláknech jako jediného bloku.
- Do API KeyPairGenerator, Signature a KeyFactory byla přidána podpora algoritmů ML-KEM (CRYSTALS-Kyber) a ML-DSA (CRYSTALS-Dilithium), standardizovaných Národním ústavem standardů a technologií USA (NIST) a odolných vůči útokům pomocí kvantových počítačů. Tyto algoritmy využívají kryptografické metody založené na řešení úloh teorie mřížek, jejichž doba řešení se na běžných i kvantových počítačích nijak neliší.
- V garbage collectoru ZGC byla odstraněna podpora negenerativního režimu, který neodděloval zpracování "starých" a "mladých" objektů. Od verze Java SE 23 je generativní režim ZGC používán ve výchozím nastavení.
- Bylo přidáno výstupní varování o používání API JNI (Java Native Interface) a FFM (Foreign Function & Memory) s cílem připravit vývojáře na omezení přístupu k těmto API v důsledku zavedení režimu zabezpečení integrity v některém z budoucích vydání, který výchozí zakazuje interakci s nativním kódem.
- Bylo zahrnuto varování při používání metod přístupu k externí paměti (mimo JVM), které poskytuje třída sun.misc.Unsafe. Pro přístup k paměti mimo hromadu (off-heap) a interakci s externím kódem se doporučuje používat API VarHandle. V minulém vydání byla podpora sun.misc.Unsafe označena jako zastaralá.
- Byl deaktivován Security Manager, který již dlouho ztratil relevanci a stal se nepotřebným po ukončení podpory pro prohlížečový plugin. Security Manager byl vyřazen jako zastaralý ve verzi Java 17. V jednom z nadcházejících vydání se plánuje úplné odstranění kódu Security Manager.
- Byl odstraněn kód pro podporu 32bitové platformy OS Windows na systémech x86. Bylo vyhlášeno zastaralým a je plánováno odstranění portu Java pro 32bitové systémy x86 (podpora Linuxu na 32bitových systémech x86 bude ukončena).
Dále je třeba zmínit vydání aktualizace platformy pro vytváření aplikací s grafickým rozhraním JavaFX 24 a nový release univerzální virtuální mašiny GraalVM, která podporuje spouštění aplikací v JavaScriptu (Node.js), Pythonu, Ruby, R, jakýchkoli jazycích pro JVM (Java, Scala, Clojure, Kotlin) a jazykách, pro které lze generovat bitcode LLVM (C, C++, Rust). Kromě podpory JDK 24 byla v nové verzi GraalVM provedena optimalizace pro úkoly související s machine learning, byla zlepšena podpora kompilace Java bytecode do strojového kódu, byl přidán mechanismus SkipFlow pro zmenšení velikosti spouštěcích souborů a zkrácení doby kompilace.
Zdroj: opennet.ru
