Widać, że powoli wchodzimy w sezon urlopowy, ponieważ ostatni tydzień był wyjątkowo… spokojny. Tak naprawdę, z dużych ogłoszeń mieliśmy do czynienia wyłącznie z nowinkami związanymi z GraalVM. Dlatego też własnie temu tematowi poświęcimy całą dzisiejszą edycje.
Rys historyczny
Żeby „miękko” wprowadzić wszystkich w temat dzisiejszej edycji, wypada przyglądnąć się temu, jak historycznie wyglądała kwestia licencji GraalVM. Ten „Święty Graal maszyn wirtualnych” zawsze posiadał bowiem dwa różne warianty – pierwszy z nich to GraalVM Community Edition. Ta edycja (często nazywana GraalVM CE) to jest prawdopodobnie ten GraalVM z którym moglibyście mieć styczność, stanowiący podstawę choćby dla natywnych obrazów generowanych przez większość frameworków. Równocześnie jednak istniało coś takiego jak GraalVM Enterprise Edition. Jednak niech nie zmyli Was zbieżność nazewnictwa choćby z taką Jakarta EE. O ile bowiem GraalVM CE można używać dość swobodnie (sam projekt wydany jest na licencji GPL 2.0, a generowane przez niego artefakty – na licencjach poszczególnych języków), o tyle GraalVM EE był projektem komercyjnym, wydany na bazie umowy licencyjnej GraalVM Oracle Technology Network. Oznacza to, że do jego użycia w środowisku produkcyjnym niezbędne jest posiadanie komercyjnej subskrypcji Oracle. Ta bywa skomplikowana.
Jeżeli używaliśmy Chmury Oracle – w zasadzie nie musieliśmy się niczym przejmować, licencja była de facto „w pakiecie”. Jeżeli jednak interesowało nas użycie GraalVM w jakimkolwiek innym środowisku chmurowym, niezbędna była opłata licencyjna, powiązana (przynajmniej na którymś etapie, historycznie mogło się to zmieniać) z ilością procesorów. Z tego też powodu, wiele zespołów rezygnowało z używania Enterprise Edition, w której to zmiany wcale nie były kosmetyczne i związane ze wsparciem komercyjnym, jak to zwykle bywa przy OpenJDK. Na przestrzeni lat poszczególne funkcjonalności przepływały między EE oraz CE, ale ta pierwsza zawsze cechowała się większą wydajnością i niektórymi kluczowymi featurami – jak np. wsparciem dla G1.
Taka sytuacja utrzymywała się przez lata, jednak ostatnimi czasy zauważyć można sporo ruchu w tej kwestii. Końcówką zeszłego roku dostaliśmy ogłoszenie o planach wintegrowania sporej części GraalVM CE do OpenJDK (co wiązało się będzie ze zmianami licencyjnymi), zaś w ostatnimi tygodniu gruchnęła wiadomość o końcu wydawania GraalVM Enterprise Edition.
Zainstaluj teraz i czytaj tylko dobre teksty!
GraalVM EE is Dead, Long Live Oracle GraalVM
Jak opisano w publikacji A New GraalVM Release and New Free License!, GraalVM Enterprise Edition został bowie zastąpiony przez Oracle GraalVM, nową dystrybucję z nowym modelem licencyjnym. GraalVM Free Terms and Conditions (GFTC) license for Early Adopter Versions – bo tak nazywa się nowa licencja – to spory krok do przodu. W odróżnieniu od wspomnianych zapisów GraalVM Enterprise Edition, Oracle GraalVM umożliwia bowiem darmowe użycie, zarówno w developmencie, jak i na środowisku komercyjnym. W związku z tym, możemy używać teraz Oracle GraalVM przy tworzeniu internalowych aplikacji wspierających biznes. Tutaj jednak wchodzą pewne zawiłości – o ile bowiem w FAQ wspominane jest o darmowym użyciu w aplikacjach komercyjnych, o tyle szczegóły licencji wspominają o tym, że muszą być to aplikacje „nie udostępniane za opłatą”. Oznacza to więc, że w wypadku prac konsultingowych albo przy tworzeniu rozwiązań Software-as-a-Service, przed użyciem mocno sugerowałbym skonsultowanie się z Oracle, czy nasze rozwiązanie nie wymaga zakupu ichniejszej subskrypcji.
Zmieniono też nazewnictwo. Zamiast wersji GraalVM 23.x mamy teraz GraalVM for JDK 17 oraz GraalVM for JDK 20. Jest to zmiana która była zapowiadana już jakiś czas temu, a mająca związek z migracją części GraalVM CE do OpenJDK i przyjęcia tamtejszego modelu releasowego. W tym miejscu warto wspomnieć o tym, że nie bez powodu nazwa licencji zawiera człon „License for Early Adopter Versions”. W praktyce bowiem licencja obowiązuje przez rok dla wersji LTS (jak JDK 17) oraz przez sześć miesięcy dla wersji nie-LTS (jak JDK 20). Po tym czasie wygasa i zostaje automatycznie przekonwertowana do dotychczas obowiązującej Oracle Technology Network.
Mimo wspomnianych powyższych ograniczeń, w dalszym ciągu, Oracle GraalVM to duży krok do przodu dla projektu. Zwłaszcza, że wraz z nową wersją pojawiają się również nowe funkcjonalności.
Co nowego przychodzi wraz z Oracle GraalVM
As for new features, the most interesting from my perspective is the new profiler (unfortunately, not available in the CE version). To simplify, historically Native Images have been characterized by faster startup than „classic” applications, but often feature worse performance than JIT-compiled ones. This is because GraalVM (at least in the CE version) could only optimize applications based on static data available at image build time, while the JIT compiler can additionally infer based on real-world production characteristics of the application. In the Enterprise Edition (now known as Oracle GraalVM), GraalVM developers use several additional techniques, including profile-guided optimization (PGO). Now the GraalVM developers have decided to enhance it with ML to get a few extra percentages of performance. By using pre-learned machine learning models in the building process, they were able to achieve even better results.
Poza PGO, nowy GraalVM wprowadza jeszcze kilka innych technik optymalizacji, ale zmiany nie kończą się na nich. Wprodzono bowiem Native Image Bundles – czyli możliwość łatwego dzielenia się konfiguracją buildu GraalVM między programistami. Inną funkcją dodaną w tym wydaniu jest możliwość generowania raportów z budowy przez Native Image. Raporty te dostarczają informacji o środowisku budowy, wykorzystywanych zasobach i innych wynikach analiz. Aby takowe zaś jeszcze ułatwić, otwarto źródła Ideal Graph Visualizer (IGV) – narzędzia służącego do analiz grafów kompilacji, co może pomóc w walce z problemami z performance .
Ponadto wsparcie dla AWT w Native Image zostało rozszerzone na Linuxa, co umożliwia jeszcze większej liczbie aplikacji GUI Java dystrybuowanie poprzez Native Image. Jeśli chodzi zaś o Developer Experience, ułatwiono debugowanie dla Windowsa, azarządzanie za pomocą JMX jest teraz możliwe za pomocą opcji --enable-monitoring
. Wydanie zawiera również listę bibliotek i frameworków, które zostały zweryfikowane pod kątem działania z Native Image. Kończąc, GraalVM JIT obsługuje teraz też kolejny Garbage Collector – ZGC.
Wszystkie detale znajdziecie we wspomnianym już poście A New GraalVM Release and New Free License!. Dla lubiących zaś format wideo, polecam towarzyszący nowościom webinar.
Zainstaluj teraz i czytaj tylko dobre teksty!
GraalVM to nie tylko Java
Dodatkowo, przy okazji premiery Oracle JDK otrzymaliśmy dodatkową publikacje What’s New in GraalVM Languages, przypominającą, że GraalVM wychodzi daleko poza świat JVM. Skupia się ona na zmianach dla innych języków wspieranych przez maszynę wirtualną.
GraalPy, runtime Pythona zbudowany na bazie GraalVM, teraz obsługuje również system Windows. Dodatkowo, GraalPy wprowadza nową implementację swojego interfejsu Python C API, co zwiększa wydajność i kompatybilność z niektórymi rozszerzeniami. Można to zobaczyć w zaktualizowanych wskaźnikach, które pokazują poprawę wydajności w porównaniu do CPython. Aktualizacji doczekała się też wersja języka i standardowych bibliotek, dodano także wsparcia dla asyncio
i wtyczki dla virtualenv
.
Ulepszenia nie kończą się jednak na Pythonie. TruffleRuby i Node.js, poza aktualizacjami runtime, dostały obsługę java.lang.BigInteger
. Wprowadzono również zmiany w polityce Polyglot Sandboxing, które pozwalają na lepszą kontrolę nad uprawnieniami dla „kodu gościa”. Na koniec, wprowadzono ulepszenia do Truffle DSL dzięki adnotacji @GenerateInline, która pozwala na zasugerowanie, które fragmenty kodu powinny zostać zinlinowane.
A jeżeli jesteście ciekawi, do czego można użyć takiego właśnie GraalPy, na oficjalnym kanale YouTube GraalVM znaleść możecie wideo Using Python from Java with GraalVM, prezentujące pełny proces. Podczas ostatniego Spring I/O (pewnie jeszcze będę do niego wracał) pojawiła się też sesja Empower your Spring-Applications with Python-Features on GraalVM, ale niestety nagranie nie jest jeszcze dostępne. Te jednak stopniowo „skapują”, więc jeśli nie chcecie przegapić, zasubskrybujcie kanał Spring/IO.