GraalVM

GraalVM
Logo GraalVM
Logo programu
Autor Oracle Corporation (Oracle Labs)
Pierwsze wydanie kwiecień 2018 (1.0 RC1); 9 maja 2019 (19.0, wydanie produkcyjne)
Język programowania Java
Platforma sprzętowa x86-64, AArch64
System operacyjny Linux, macOS, Microsoft Windows
Rodzaj JDK, środowisko uruchomieniowe, kompilator
Licencja GPLv2 z wyjątkiem Classpath (Community Edition); GraalVM Free Terms and Conditions (Oracle GraalVM)
Strona internetowa

GraalVM – środowisko uruchomieniowe i zestaw narzędzi programistycznych opartych na platformie Java, rozwijany przez Oracle i społeczność programistów. Projekt obejmuje dystrybucję Java Development Kit (JDK), kompilator optymalizujący Graal, technologię kompilacji natywnej Native Image oraz narzędzia umożliwiające wykonywanie programów napisanych w różnych językach programowania.

GraalVM bazuje na maszynie wirtualnej HotSpot i umożliwia uruchamianie aplikacji napisanych w języku Java oraz innych językach kompilowanych do kodu bajtowego Javy, takich jak Kotlin i Scala. Oprócz kompilacji kodu podczas wykonywania programu udostępnia narzędzie Native Image, pozwalające na wcześniejsze przekształcenie aplikacji w natywny plik wykonywalny przeznaczony dla określonego systemu operacyjnego i architektury procesora.

Jednym z założeń projektu jest połączenie optymalizacji wykonywania programów z możliwością współpracy różnych języków w ramach wspólnego środowiska. GraalVM znajduje zastosowanie między innymi w tworzeniu aplikacji serwerowych, mikrousług i oprogramowania uruchamianego w środowiskach chmurowych.

Historia

Początki technologii wykorzystywanych w GraalVM wiążą się z pracami badawczymi nad kompilatorami dynamicznymi i środowiskami uruchomieniowymi języków programowania. W 2013 roku Thomas Würthinger i współautorzy opublikowali artykuł naukowy One VM to Rule Them All, w którym przedstawili koncepcję wykorzystania wspólnej infrastruktury kompilacyjnej do implementowania różnych języków programowania. Opisany w publikacji model wykorzystywał framework Truffle oraz kompilator Graal.

Projekt GraalVM rozwijano następnie w Oracle Labs. W kwietniu 2018 roku udostępniono wersję 1.0 RC1, przeznaczoną do testowania technologii przed jej pierwszym wydaniem produkcyjnym.

9 maja 2019 roku opublikowano GraalVM 19.0, pierwsze wydanie uznane za gotowe do zastosowań produkcyjnych. Obejmowało ono między innymi kompilator Graal, środowisko HotSpot, framework Truffle i narzędzia umożliwiające kompilację aplikacji Java do postaci natywnej. Projekt był udostępniany w dwóch głównych edycjach: GraalVM Community Edition oraz GraalVM Enterprise Edition.

W kolejnych latach rozwijano obsługę nowszych wersji Javy, kompilację natywną oraz narzędzia do optymalizacji i monitorowania aplikacji. W czerwcu 2023 roku Oracle zmienił model licencjonowania swojej dystrybucji GraalVM, wprowadzając licencję GraalVM Free Terms and Conditions (GFTC), dopuszczającą bezpłatne wykorzystanie oprogramowania również w zastosowaniach komercyjnych, z zastrzeżeniem określonych warunków.

Od września 2025 roku zmieniono sposób numerowania wydań GraalVM, rezygnując z wcześniejszego nazewnictwa „GraalVM for JDK” na rzecz numeracji odpowiadającej wersji bazowej JDK. W 2026 roku rozwój projektu obejmował serię wydań GraalVM 25, w tym wydanie 25.4 z września 2026 roku.

Architektura

Architektura GraalVM obejmuje kilka współpracujących komponentów odpowiedzialnych za wykonywanie kodu, jego optymalizację oraz obsługę różnych języków programowania. Do najważniejszych należą kompilator Graal, framework Truffle, technologia Native Image i interfejs Polyglot API.

Kompilator Graal

Graal jest optymalizującym kompilatorem just-in-time (JIT), napisanym w języku Java. Jego zadaniem jest przekształcanie kodu bajtowego wykonywanego przez maszynę wirtualną Javy w kod maszynowy procesora. Kompilator może być wykorzystywany w środowisku HotSpot do optymalizacji fragmentów programu intensywnie wykonywanych podczas jego działania.

Graal wykorzystuje między innymi rozwijanie wywołań metod (inlining), analizę przepływu danych oraz analizę ucieczki obiektów (escape analysis). Mechanizmy te umożliwiają ograniczanie liczby wywołań metod i eliminowanie części operacji przydziału pamięci. Szczególne znaczenie mogą mieć w aplikacjach stosujących rozbudowane abstrakcje programistyczne.

W odróżnieniu od kompilacji wykonywanej przed uruchomieniem programu kompilator JIT może korzystać z informacji o jego zachowaniu podczas działania. Pozwala to dostosowywać optymalizacje do wykonywanych ścieżek kodu, ale wymaga poniesienia kosztu kompilacji w czasie działania aplikacji.

Truffle

Truffle jest frameworkiem przeznaczonym do tworzenia interpreterów języków programowania w Javie. Umożliwia ich implementowanie z wykorzystaniem abstrakcyjnych drzew składniowych (AST), które mogą być następnie optymalizowane przez kompilator Graal.

Zastosowanie Truffle pozwala oddzielić implementację semantyki konkretnego języka programowania od części mechanizmów odpowiedzialnych za optymalizację i generowanie kodu maszynowego. Framework dostarcza także interfejsy umożliwiające tworzenie narzędzi, takich jak debugery i profilery, współpracujących z różnymi językami opartymi na Truffle.

Native Image

GraalVM Native Image jest narzędziem pozwalającym na kompilowanie aplikacji napisanych w Javie i innych językach działających na JVM do natywnych plików wykonywalnych, z wykorzystaniem kompilacji ahead-of-time (AOT).

Podczas tworzenia pliku wykonywalnego Native Image przeprowadza analizę statyczną kodu bajtowego aplikacji i jej zależności. Analiza rozpoczyna się od punktów wejścia programu i służy określeniu, które klasy, metody i pola mogą zostać wykorzystane podczas działania aplikacji. Następnie niezbędne elementy są kompilowane do kodu maszynowego.

Powstały plik zawiera kod aplikacji, wymagane biblioteki oraz odpowiednie składniki środowiska uruchomieniowego, takie jak mechanizmy zarządzania pamięcią i obsługi wątków. Do jego wykonania nie jest konieczna osobna instalacja maszyny wirtualnej Javy. Plik jest jednak przygotowywany dla określonego systemu operacyjnego i architektury sprzętowej.

Kompilacja AOT umożliwia ograniczenie czasu uruchamiania programu i części narzutów związanych z działaniem JVM. Może również zmniejszać zużycie pamięci podczas wykonywania aplikacji. Korzyści zależą jednak od charakterystyki programu i zastosowanych optymalizacji.

Polyglot API

GraalVM Polyglot API jest interfejsem programistycznym umożliwiającym uruchamianie kodu jednego języka z poziomu aplikacji napisanej w innym języku. Przykładowo aplikacja Java może wykonywać skrypty JavaScript lub Python oraz wymieniać z nimi dane.

Interfejs udostępnia mechanizmy tworzenia kontekstów wykonania, wywoływania funkcji, przekazywania argumentów i korzystania z obiektów udostępnianych przez poszczególne języki. Współpraca między językami może odbywać się w obrębie jednego procesu, bez konieczności komunikowania się przez zewnętrzny protokół wymiany danych.

Obsługiwane języki programowania

GraalVM obsługuje programy napisane w Javie i innych językach wykorzystujących kod bajtowy JVM. W jego ekosystemie rozwijane są również implementacje języków oparte na Truffle oraz powiązanych technologiach.

Do rozwiązań tych należą między innymi:

Z ekosystemem GraalVM związana jest również implementacja języka Ruby o nazwie TruffleRuby, wykorzystująca framework Truffle. We wcześniejszych wersjach GraalVM rozwijano także środowisko wykonywania kodu pośredniego LLVM, umożliwiające obsługę programów kompilowanych do tego formatu.

Poszczególne implementacje języków są rozwijane jako odrębne komponenty. Ich dostępność, zakres obsługiwanych funkcji i sposób instalacji mogą różnić się w zależności od wersji oraz dystrybucji GraalVM.

Zastosowania

GraalVM znajduje zastosowanie w tworzeniu i uruchamianiu aplikacji wykorzystujących ekosystem Javy. Technologia Native Image jest stosowana przede wszystkim w oprogramowaniu, w którym istotne są czas uruchamiania i zużycie pamięci. Dotyczy to między innymi mikrousług, aplikacji uruchamianych w kontenerach oraz funkcji wykonywanych w architekturze bezserwerowej.

Obsługę Native Image zapewniają frameworki takie jak Spring Boot, Quarkus, Micronaut i Helidon. Umożliwiają one przygotowywanie aplikacji do kompilacji natywnej, w tym gromadzenie informacji niezbędnych do prawidłowego działania bibliotek korzystających z dynamicznych mechanizmów Javy.

GraalVM może być również stosowany do osadzania języków skryptowych w aplikacjach Java. Dzięki Polyglot API możliwe jest udostępnianie funkcjonalności języka skryptowego bez uruchamiania odrębnego procesu interpretera.

Ograniczenia

Kompilacja natywna w GraalVM wiąże się z ograniczeniami wynikającymi z przyjętego modelu analizy statycznej. Native Image wykorzystuje założenie zamkniętego świata (closed-world assumption), zgodnie z którym kod potrzebny podczas działania aplikacji musi być znany na etapie jej kompilacji.

Niektóre mechanizmy Javy, takie jak refleksja, dynamiczne ładowanie klas, Java Native Interface czy dostęp do zasobów określanych dopiero podczas wykonywania programu, mogą wymagać dodatkowych informacji konfiguracyjnych. Native Image obsługuje w tym celu metadane określające elementy programu, które muszą zostać uwzględnione w pliku wykonywalnym.

Ograniczenia te mogą utrudniać kompilowanie aplikacji korzystających z bibliotek projektowanych z myślą o dynamicznym środowisku JVM. Niektóre rozwiązania wymagają dostosowania kodu, konfiguracji albo zastosowania wersji bibliotek zgodnych z Native Image.

Kompilacja AOT wymaga również dodatkowego etapu budowania aplikacji, który może być czasochłonny i wymagać znacznych zasobów. Ponadto wcześniejsza kompilacja kodu ogranicza możliwość stosowania podczas wykonywania programu optymalizacji opartych na jego bieżącym zachowaniu. Dlatego krótszy czas uruchamiania i mniejsze zużycie pamięci nie muszą oznaczać większej przepustowości w przypadku długotrwale działających aplikacji.

Dystrybucje i licencjonowanie

GraalVM jest udostępniany w kilku dystrybucjach, różniących się podstawową implementacją JDK, licencją oraz zakresem udostępnianych funkcjonalności.

GraalVM Community Edition jest dystrybucją o otwartym kodzie źródłowym, opartą na OpenJDK. Jej podstawowe komponenty są udostępniane na zasadach licencji GNU General Public License w wersji 2 z wyjątkiem Classpath. Poszczególne dodatkowe komponenty mogą podlegać odmiennym warunkom licencyjnym.

Oracle GraalVM jest dystrybucją opartą na Oracle JDK. Od czerwca 2023 roku Oracle udostępnia nowe wersje na warunkach GraalVM Free Terms and Conditions (GFTC), które dopuszczają bezpłatne wykorzystanie produkcyjne i komercyjne. Licencja przewiduje także możliwość nieodpłatnej redystrybucji, z zachowaniem określonych ograniczeń.

Wcześniej Oracle rozwijał komercyjną dystrybucję pod nazwą GraalVM Enterprise Edition. Nowy model dystrybucji Oracle GraalVM wprowadzony w 2023 roku zastąpił wcześniejsze rozwiązanie dla nowych wydań produktu. Starsze wersje Enterprise Edition pozostawały objęte odrębnym cyklem aktualizacji.

Zobacz też

Przypisy

  1. 1 2 3 4 M. Šipek, B. Mihaljević, A. Radovan: Exploring Aspects of Polyglot High-Performance Virtual Machine GraalVM. arXiv, 2021-12-15. [dostęp 2026-10-21].
  2. 1 2 GraalVM as a Java Virtual Machine. GraalVM Documentation. [dostęp 2026-10-21].
  3. 1 2 3 4 Native Image Basics. GraalVM Documentation. [dostęp 2026-10-21].
  4. 1 2 3 4 5 6 Alina Yurenko: Revolutionizing Java with GraalVM Native Image. InfoQ, 2022-04-06. [dostęp 2026-10-21].
  5. 1 2 Thomas Würthinger, Christian Wimmer, Andreas Wöß, Lukas Stadler, Gilles Duboscq, Christian Humer, Gregor Richards, Doug Simon, Mario Wolczko. One VM to Rule Them All. „Proceedings of the 2013 ACM International Symposium on New Ideas, New Paradigms, and Reflections on Programming & Software”, s. 187–204, 2013. DOI: 10.1145/2509578.2509581.
  6. 1 2 Michael Redlich: GraalVM 19.0: the Anticipated GA Release. InfoQ, 2019-06-17. [dostęp 2026-10-21].
  7. 1 2 3 Shaun Smith: Introducing the GraalVM Free License. Oracle, 2023-06-13. [dostęp 2026-10-21].
  8. 1 2 GraalVM Release Calendar. GraalVM. [dostęp 2026-10-21].
  9. ↑ GraalVM 25.4 Release Notes. GraalVM. [dostęp 2026-10-21].
  10. ↑ Graal Compiler. GraalVM Documentation. [dostęp 2026-10-21].
  11. 1 2 GraalVM as a Platform. GraalVM Documentation. [dostęp 2026-10-21].
  12. 1 2 3 Embedding Languages. GraalVM Documentation. [dostęp 2026-10-21].
  13. 1 2 3 Graal Languages. GraalVM Documentation. [dostęp 2026-10-21].
  14. ↑ TruffleRuby. GraalVM Documentation. [dostęp 2026-10-21].
  15. ↑ Getting Started. GraalVM Documentation. [dostęp 2026-10-21].
  16. ↑ GraalVM Native Applications. Spring Boot Documentation. [dostęp 2026-10-21].
  17. 1 2 Native Image Compatibility Guide. GraalVM Documentation. [dostęp 2026-10-21].
  18. 1 2 Reachability Metadata. GraalVM Documentation. [dostęp 2026-10-21].
  19. 1 2 3 Frequently Asked Questions. GraalVM. [dostęp 2026-10-21].

Linki zewnętrzne