Wydanie Java SE 24 i OpenJDK 24

Po sześciu miesiącach prac rozwojowych firma Oracle opublikowała platformę Java SE 24 (Java Platform, Standard Edition 24), której referencyjna realizacja opiera się na otwartym projekcie OpenJDK. Z wyjątkiem usunięcia niektórych przestarzałych funkcji, Java SE 24 zachowuje wsteczną kompatybilność z poprzednimi wersjami platformy Java — większość wcześniej napisanych projektów Java będzie działać bez zmian na nowej wersji. Gotowe do zainstalowania pakiety Java SE 24 (JDK, JRE i Server JRE) są dostępne dla systemów Linux (x86_64, AArch64), Windows (x86_64) i macOS (x86_64, AArch64). Referencyjna realizacja Java SE 24, opracowana w ramach projektu OpenJDK, jest całkowicie otwarta na licencji GPLv2 z wyjątkami GNU ClassPath, które zezwalają na dynamiczne łączenie z komercyjnymi produktami.

Java SE 24 należy do kategorii wydań o standardowym okresie wsparcia, a aktualizacje będą wydawane do następnej wersji. Jako wersje z długoterminowym wsparciem (LTS) powinny być używane Java SE 21 lub Java SE 17, dla których aktualizacje będą wydawane do odpowiednio 2031 i 2029 roku (publiczne — do 2028 i 2026 roku). Rozszerzone wsparcie dla gałęzi LTS Java SE 8 potrwa do 2030 roku, a dla Java SE 11 — do 2032 roku. Następną wersją LTS będzie jesienne wydanie Java SE 25.

Wśród nowości w Java SE 24 znajdują się:

  • Zaproponowano eksperymentalny generatywny tryb działania zbieracza śmieci Shenandoah, w którym oddzielnie przetwarzane są stare i niedawno utworzone obiekty w celu zwiększenia efektywności usuwania obiektów o krótkim czasie życia. Nowy tryb zapewnia bardziej przewidywalną przepustowość, odporność na zmiany obciążenia i zmniejszenie zużycia pamięci podczas zbierania śmieci. Planista Shenandoah ma na celu skrócenie czasu zatrzymania podczas zbierania śmieci dzięki równoległemu wykonaniu większej ilości pracy z aplikacjami Java.
  • W HotSpot JVM wprowadzono eksperymentalne wsparcie dla kompaktowych nagłówków obiektów, których rozmiar w systemach 64-bitowych zmniejszył się z 96 do 64 bitów (z 12 do 8 bajtów). Zmniejszenie rozmiaru nagłówków pozwala na zmniejszenie rozmiaru sterty i zwiększenie efektywności działania cache'a.
  • W zbieraczu śmieci G1 uproszczono implementację barier, które śledzą dostęp aplikacji do pamięci. W nowej wersji operacje rozszerzenia barier przeniesiono na późniejszy etap kompilacji w JIT C2. Przeprowadzone testy pokazują, że takie przeniesienie pozwala obniżyć koszty operacyjne w JIT compilerze C2 o 10-20% w zależności od aplikacji.
  • Dodano API do korzystania z kryptograficznych funkcji generowania kluczy (KDF, key derivation function), które umożliwiają generowanie dodatkowych kluczy o wymaganej długości na podstawie tajnego klucza (np. hasła) oraz dowolnego zestawu danych. API KDF ma obecnie status wstępny (preview).
  • Dodano możliwość wstępnego (Ahead-of-Time) załadowania i kompozycji klas. Zmiana ta umożliwia szybsze uruchomienie HotSpot JVM dzięki dostarczaniu klas używanych w aplikacji w już załadowanym i skomponowanym stanie. Podczas pierwszego uruchomienia aplikacji stan wszystkich klas jest resetowany do pamięci podręcznej, a przy kolejnych uruchomieniach wykorzystywany jest do przyspieszenia ładowania.
  • Dodano API Class-File do analizy, generowania i przekształcania plików z klasami 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); } } });

  • Dodano rozszerzone API Stream, wspierające definicję własnych operacji pośrednich, które mogą być przydatne w przypadkach, gdy istniejące wbudowane operacje pośrednie są niewystarczające do pożądanej konwersji danych. Własne przetworniki podłącza się za pomocą nowej operacji pośredniej Stream::gather(Gatherer), która przetwarza elementy strumienia, stosując do nich określony przez użytkownika przetwornik. 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]]
  • Zaprezentowano czwarte wstępne wdrożenie ograniczonych wartości (Scoped Values), które umożliwiają współdzielenie niezmiennych danych w strumieniach oraz efektywną wymianę danych między podstrumieniami (wartości są dziedziczone). Scoped Values rozwijają się, aby zastąpić mechanizm zmiennych lokalnych dla strumienia (thread-local variables) i są bardziej efektywne przy użyciu bardzo dużej liczby wirtualnych strumieni (tysiące i miliony strumieni). Główna różnica między Scoped Values a zmiennymi lokalnymi dla strumienia polega na tym, że te pierwsze są zapisywane raz, a następnie nie mogą być zmieniane i pozostają dostępne tylko w czasie wykonywania strumienia.
  • Do mechanizmów dopasowania wzorców dodano wstępną obsługę używania typów prymitywnych (int, byte, char i inne podstawowe typy, które nie są obiektami) we wszystkich rodzajach szablonów, w operatorze „instanceof” oraz w blokach „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 … }
  • Zaprezentowano dziewiąte wstępne wdrożenie API Vector, które oferuje funkcje do obliczeń wektorowych wykonywanych z wykorzystaniem instrukcji wektorowych procesorów x86_64 i AArch64, umożliwiając jednoczesne zastosowanie operacji do wielu wartości (SIMD). W przeciwieństwie do możliwości automatycznej wektoryzacji operacji skalarowych oferowanych przez kompilator JIT HotSpot, nowe API umożliwia wyraźne zarządzanie wektoryzacją dla równoległego przetwarzania danych.
  • Wdrożono obsługę synchronizacji wirtualnych strumieni bez ich przypinania (pinning) do wątków związanych z platformą. Wirtualne strumienie w zsynchonizowanej metodzie lub wyrażeniu w stanie blokady teraz zwalniają swój wątek platformowy, pozwalając innym wirtualnym strumieniom na jego wykorzystanie, co znacznie zwiększa liczbę dostępnych wirtualnych strumieni i poprawia skalowalność aplikacji wykorzystujących wielowątkowość.
  • Dodano trzecie wstępne rozwiązanie dla możliwości wskazywania w konstruktorach wyrażeń przed wywołaniem super(…), używanego do jawnego wywołania konstruktora klasy rodzicielskiej z konstruktora klasy dziedziczącej, jeśli te wyrażenia nie odnoszą się do tworzonego przez konstruktor obiektu. class Outer { void hello() { System.out.println("Hello"); } class Inner { Inner() { hello(); super(); } } }
  • W narzędziu jlink dodano wsparcie dla tworzenia obrazów run-time bez użycia plików JMOD, co pozwala na zmniejszenie rozmiaru JDK o około 25%.
  • Dodano drugi wstępny wariant użycia wyrażenia „import module M” do importowania wszystkich pakietów eksportowanych przez dany moduł. Zmiana ta znacznie ułatwia ponowne wykorzystanie bibliotek modułowych, umożliwiając dołączanie bibliotek i klas bez określania ich pozycji w hierarchii pakietów. Na przykład, użycie „import module java.base” spowoduje zaimportowanie wszystkich 54 pakietów wchodzących w skład modułu java.base, które wcześniej należałoby wymienić oddzielnie (np. „import java.io.*”, „import java.util.*” itd.).
  • Dodano czwartą wstępną realizację niejawnie zadeklarowanych klas i anonimowych instancji metody „main”, w których można zrezygnować z deklaracji public/static, przekazywania tablicy argumentów i innych elementów związanych z deklaracją klasy. // było public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } // teraz można void main() { System.out.println("Hello, World!"); }
  • Proponuje się do testowania czwarty wstępny wariant API dla strukturalnego równoległości (Structured Concurrency), upraszczającego rozwój aplikacji wielowątkowych poprzez przetwarzanie wielu zadań wykonywanych w różnych wątkach jako jednego bloku.
  • W API KeyPairGenerator, Signature i KeyFactory dodano wsparcie dla algorytmów ML-KEM (CRYSTALS-Kyber) i ML-DSA (CRYSTALS-Dilithium), standardyzowanych przez Krajowy Instytut Standaryzacji i Technologii USA (NIST) i odpornych na ataki przy użyciu komputerów kwantowych. Algorytmy te wykorzystują metody kryptografii oparte na rozwiązaniu problemów teorii krat, których czas rozwiązania nie różni się na normalnych i kwantowych komputerach.
  • W zbieraczu śmieci ZGC usunięto wsparcie dla trybu nie-generatywnego, który nie rozdzielał przetwarzania „starych” i „młodych” obiektów. Od wersji Java SE 23 tryb generatywny ZGC jest domyślnie stosowany.
  • Dodano wyświetlanie ostrzeżeń dotyczących korzystania z API JNI (Java Native Interface) oraz FFM (Foreign Function & Memory) w celu przygotowania programistów na ograniczenia dostępu do tych API w związku z włączeniem w jednym z przyszłych wydań trybu zapewnienia integralności, który domyślnie zabrania interakcji z kodem natywnym.
  • Włączono wyświetlanie ostrzeżenia przy korzystaniu z metod dostępu do pamięci zewnętrznej (poza JVM), udostępnianych przez klasę sun.misc.Unsafe. Do uzyskiwania dostępu do pamięci poza stertą (off-heap) i interakcji z kodem zewnętrznym zaleca się użycie API VarHandle. W poprzednim wydaniu wsparcie dla sun.misc.Unsafe zostało uznane za przestarzałe.
  • Wyłączono Security Manager, który od dawna stracił na znaczeniu i stał się zbędny po zakończeniu wsparcia dla wtyczki przeglądarki. Security Manager został uznany za przestarzały w Java 17. W jednym z kolejnych wydań planuje się całkowite usunięcie kodu Security Managera.
  • Usunięto kod wspierający 32-bitową platformę systemu Windows na systemach x86. Port Java dla 32-bitowych systemów x86 został uznany za przestarzały i zaplanowano jego usunięcie (wsparcie dla Linuxa na 32-bitowych systemach x86 zostanie zakończone).

Dodatkowo można zauważyć publikację aktualizacji platformy do tworzenia aplikacji z graficznym interfejsem JavaFX 24 oraz nową wersję uniwersalnej maszyny wirtualnej GraalVM, która obsługuje uruchamianie aplikacji w JavaScript (Node.js), Pythonie, Rubym, R, wszelkich językach dla JVM (Java, Scala, Clojure, Kotlin) oraz językach, dla których może być generowany kod bitowy LLVM (C, C++, Rust). Oprócz wsparcia dla JDK 24 nowa wersja GraalVM zawiera optymalizacje dla zadań związanych z uczeniem maszynowym, poprawioną obsługę kompilacji kodu bajtowego Java do kodu maszynowego, nowy mechanizm SkipFlow do redukcji rozmiaru plików wykonywalnych oraz skrócenia czasu kompilacji.

Źródło: opennet.ru

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster