Dzisiaj kontynuacja z tematów z poprzedniego tygodnia – JDK 21 oraz GraalVM for JDK 21, ale także masa innych zapowiedzi związanych z Graal’em.
1. Ciąg dalszy publikacji w temacie JDK 21
Jako, że od premiery nowego JDK 21 minął dopiero tydzień, przyglądnijmy się nowym publikacjom, które zdążyły się od zeszłego tygodnia pojawić.
Rozpocznijmy od tematu wirtualnych wątków, który w ostatnim czasie dominuje w wielu dyskusjach. Coraz częściej natykamy się również na materiały, które pozwalają nam zrozumieć ten temat głębiej. Właśnie miniony tydzień przyniósł nam oficjalny przewodnik od Oracle, przedstawiający techniki i najlepsze praktyki związane z Wirtualnymi Wątkami. To doskonałe wprowadzenie, w którym nie zabrakło również miejsca dla strukturalnej współbieżności – tematu, który nie jest tak szeroko omawiany w innych źródłach. Wirtualne wątki zostały ponadto docenione w drugim artykule opublikowanym przez Quarkusa, koncentrującym się na przykładach ich wykorzystania w podstawowych operacjach CRUD.
Następny tekst, który chciałem Wam podrzucić to Java 21: The Nice, The Meh, and the … Momentous, który jest swoistą recenzją nowej Javy. Autor, Cay Horstmann, dokonał analizę nowych funkcji w JDK 21, podkreślając kluczowe ulepszenia w porównaniu z Java 17. Skupiając się na praktycznych implikacjach tych funkcji dla programistów, autor akcentuje znaczenie (kto by się spodziewał) wirtualnych wątków, które odpowiadają w jego perspektywie na złożoności programowania asynchronicznego. Pozostałe funkcje, chociaż przydatne, wydają się być mniej przekonujące do aktualizacji same w sobie. Niemniej jednak, biorąc pod uwagę szereg nowych funkcjonalności w połączeniu z wielością poprawek błędów, autor dochodzi do wniosku, że aktualizacja do Java 21 jest rozsądnym wyborem, zwłaszcza dla tych, którzy zmagają się z programowaniem reaktywnym lub rozważają jego wykorzystanie. Całość ogólnie jest ciekawą analizą nowego wydania i myślę, że warto zapoznać się z perspektywą autora, nawet jeśli nie jest ona jakoś wywrotowa.
Wywrotowość zostawimy sobie bowiem na kolejną publikacje, w której Stuart Marks opowiada o swojej ulubionej funkcji JDK 21, a mianowicie… możliwości przeszukiwania Javadoc przez URL. Choć funkcja ta została wprowadzona już w JDK 19, to zyskała na popularności w związku z wprowadzeniem JDK 21 – w końcu to (nie do końca) LTS. Wcześniejsze wersje Javadoc pozwalały na wyszukiwanie, ale nowsze JDK umożliwiają tworzenie URL, które prowadzą bezpośrednio do wyników wyszukiwania. Marks z entuzjazmem opisuje, jak ta funkcja usprawnia korzystanie z dokumentacji, pozwala na tworzenie skryptów i ułatwia dostęp do informacji – w tekście pojawia się kilka przykładów.
Doczekaliśmy się też, jak zawsze, tekstu Seana Mullana poświęconego strike nowościom w przestrzeni bezpieczeństwa w nowej Javie. Aktualizacje te obejmują nowe API do Mechanizmu Enkapsulacji Klucza (KEM) dla Kryptografii Po-Kwantowej (PQC), implementację weryfikacji podpisu HSS/LMS w celu ochrony przed atakami komputerów kwantowych oraz wsparcie dla różnych algorytmów kryptografii opartej na hasłach PBES2. Wydanie to przynosi również ulepszenia w PKI poprzez dodane główne certyfikaty CA oraz poprawione limity czasowe dla OCSP, certyfikatów i listy CRL. Dodatkowo, domyślny rozmiar grupy Diffie-Hellmana dla TLS został zwiększony, a XML Signature teraz obsługuje algorytm EdDSA z nowymi właściwościami systemowymi i środkami bezpieczeństwa.
A i na sam koniec, ukazały się też dystrybucje JDK 21 od Amazonu oraz BellSoftu. Ja jednak dalej czekam na Temurina, który jak na razie posiada tylko Buildy EA
Ale jak już zaspoilerowałem, premierze JDK 21 towarzyszyło jeszcze jedno, siostrzane wydanie:
Zainstaluj teraz i czytaj tylko dobre teksty!
2. Co ma GraalVM dla JDK 21 wspólnego z królikiem z jaskini Caerbannog? Obydwa zaskakują mocą
Oprócz premiery samego JDK 21 (którą wszyscy żyjemy), Oracle opublikowało nową wersję GraalVM dla JDK 21.
Jednym z najważniejszych ulepszeń, w duchu nowego JDK, jest pełne wsparcie dla wirtualnych wątków. Również proces budowy Native Image został ulepszony, wprowadzając strategie inicjacji klasy, wsparcie dla wydarzeń JFR i sporo pomniejszych usprawnień „Developer Experience”, wprowadzając sporo nowych flag konfiguracyjnych. Całe SDK GraalVM zostało przeprojektowane dla lepszej modularności (podział SDK projektu na org.graalvm.nativeimage
, org.graalvm.polyglot
, org.graalvm.word
oraz org.graalvm.collections
) , zachowując przy tym wsteczną kompatybilność.
Dodatkowo, po raz kolejny zwiększono wydajność Native Image. Aplikacje uruchamiane za pomocą GraalVM Native Image, zoptymalizowane za pomocą profile-guided optimization (PGO) i G1 GC, wykazują wyższą przepustowość w porównaniu z tymi działającymi z JIT i kompilatorem C2 JIT – znikają więc argumenty o tym, że JIT jest bardziej optymalny w długim okresie czasu. Przy tej beczce miodu pamiętajmy jednak, że PGO dostępny jest wyłącznie w Oracle GraalVM (dawny Enterprise Edition). Tutaj też mam pozytywne wiadomości – zaktualizowany został FAQ takowego, przynosząc sporą ilość klaryfikacji. Według zapewnień Thomasa Wuerthingera (leada GraalVM), a także po mojej rozmowie z prawnikami wygląda na to, że Oracle GraalVM jest teraz rzeczywiści dopuszczalny w użyciu w aplikacjach SaaS.
Jeszcze jedną optymalizacją jest wsparcie dla pozostającego w Preview Java Vector API (JEP 338), co pozwala na wektoryzując wiele operacji JVM w natywne instrukcje procesora. Co zaskakujące, jest to zachowanie domyślnie włączone, ale może być wyłączone za pomocą opcji -Dgraal.OptimizeVectorAPI=false
.
GraalVM wprowadził również wsparcie dla mechanizmu ARM Pointer Authentication Code (PAC) na wspieranym sprzęcie. Ten mechanizm zabezpieczeń pomaga w minimalizacji ataków typu return-oriented programming (ROP) poprzez weryfikację integralności adresu powrotu funkcji. Funkcja ta jest dostępna za pomocą opcji -H:EnableCFI
.
To jeszcze nie koniec, nowa wersja GraalVM wprowadza znaczące aktualizacje do wielojęzycznego środowiska uruchomieniowego, Truffle. Truffle framework umożliwiający tworzenie interpreterów języków programowania, które są zoptymalizowane pod kompilator Just-In-Time (JIT) GraalVM, co umożliwia im uzyskiwania wysokiej wydajności. Kluczową cechą Truffle jest to, że pozwala on twórcom języków skoncentrować się na samej semantyce języka, podczas gdy aspekty optymalizacyjne są automatycznie obsługiwanych przez framework. Ponadto języki oparte na Truffle mogą być łatwo integrowane, umożliwiając współdziałanie różnych języków w jednym środowisku uruchomieniowym.
Truffle zostało teraz odłączone od GraalVM JDK, co pozwala na niezależne pobieranie interpreterów dla takich języków jak JavaScript, Python, Ruby, Java na Truffle, WebAssembly i LLVM. Te samodzielne środowiska są dostępne zarówno w wersji natywnej (skompilowanej przed uruchomieniem) jak i opartej na JVM. Co więcej, zamiast wcześniej wymaganego narzędzia gu
, wszystkie języki GraalVM są teraz dostępne w Maven Central, co upraszcza wbudowywanie języków w aplikacje Javowe. Więcej znajdziecie w poście Truffle Unchained.
A i to jeszcze nie koniec – Oracle zaczęło bowiem systematyzować narzędziówkę w koło GraalVM pod wspólną etykietą Graal Stack Components, na którą składają się GraalVM, Graal Cloud Native oraz GraalOS. O GraalVM już rozmawialiśmy, ale czas przyglądnąć się pozostałym.
Graal Cloud Native (GCN) to specjalna wersja zestawu modułów frameworka Micronaut wraz z wymaganymi bibliotekami, który został teraz „błogosławionych”, referencyjnym rozwiązaniem do do tworzenia mikroserwisów. Moduły zostały zaprojektowane od podstaw, aby mogły być kompilowane z GraalVM Native Image, tworząc natywne pliki wykonywalne idealne dla aplikacji chmurowych. Umożliwiają one pełne wykorzystanie mocy chmurowych platform usługowych i mogą być prekompilowane do Native Image – dzięki temu startują natychmiast, oferują pełną wydajność od chwili startu, bez konieczności rozgrzewania i charakteryzują się niewielkim zużyciem pamięci. GCN oferuje moduły umożliwiające niezależne od platformy wsparcie dla podstawowych usług chmurowych, takich jak przechowywanie obiektów, zarządzanie sekretami, strumieniowanie i śledzenie. Dzięki temu rozwój aplikacji jest bardziej uniwersalny i mniej zależny od konkretnego dostawcy chmury. Listę modułów znajdziecie na poniższym screenie.
W skład GCN wchodzą również narzędzia do tworzenia projektów oraz rozszerzenie do VS Code – GraalVM Tools for Micronaut.
To jednak nie wszystko, bo podczas Oracle Cloud World 2023, Oracle przedstawił GraalOS – ostatni klocek Graal Stack Components. Jest to runtime dla środowisk chmurowych, mającą na celu optymalizację wydajności i efektywności funkcji Serverless. Wykorzystując kompilację ahead-of-time (AOT) oferowaną przez GraalVM, GraalOS konwertuje aplikacje w samodzielne natywne pliki wykonywalne, eliminując nieużywane klasy, metody i pola. Dodatkowo, podobnie jak AWS SnapStart, GraalOS ma rozwiązywać problem „cold startu”, występującego podczas pierwszego wywołania funkcji po okresie bezczynności. Ma też posiadać możliwość „zamrażania” stanu w dowolnym momencie.
GraalOS zostanie środowiskiem uruchomieniowym dla Oracle Cloud Infrastructure Functions, czyniąc je bardzo interesującą opcją dla chcących odpalać funkcje serverless w oparciu o Graala. Co prawda AWS Lambda pozwala już dziś na uruchomienie GraalVM w ramach tak zwanych „Custom Runtime”, ale sprowadza się to do uruchomienia kontenera z aplikacją GraalVM – GraalOS pozwala na ominięcie tej warstwy, eliminując narzut związany z uruchamianiem kontenera i inicjalizacją JVM.
Warto dodać, że na chwilę obecną funkcji nie można jeszcze przetestować. Niemniej jednak istnieje możliwość zapisania się na wczesny dostęp. Ja to zrobiłem, chętnie się rozwiązaniem pobawię.
A jeśli chcecie zobaczyć opracowanie – GraalVM też miał swój publiczny stream releasowy. Jeżeli chcecie „poczuć” klimat takiego nowego wydania i poznać nowe funkcjonalności u źródła – zapraszam do oglądnięcia. Znajdziecie tam bowiem informacje o kilku dodatkowych nowościach, o których nie wspominałem w tekście: