SubstrateVM (nativní image u GraalVM) je sice pěkná věc, ale není to univerzální řešení. Musíte přijmout nějaká omezení, která musí splnit nejen váš kód (to je většinou celkem řešitelné), ale taky kód všech použitých knihoven – a to je někdy problém i se standardní knihovnou z JRE.
V praxi to vypadá asi takto: Větší aplikace jsou se SubstrateVM prakticky bez šance. Menší věci – pokud překousnete několikamegovou binárku (dnes snad není problém) – s trochou štěstí půjdou zkompilovat a bez problémů pojedou. Ale ne vždy, třeba u JDBC jsem si vylámal zuby.
A má to nějaké bugy (typicky se naštěstí projeví hned při kompilaci), na které není tak těžké narazit. A občas se mi stalo, že nějaký platform-specific code to považovalo za reachable a při kompilaci pro Linux jsem tomu musel na classpath dodat i třeba JNA pro Windows.
Zatím taky je omezený seznam platforem, kde to jede. Windows není zatím podporovaný, macOS nevím, z instrukčních sad jen x64. Což je vzhledem k potenciálu pro embedded škoda.
Stručně, je to užitečná věc, ale má celkem omezené možnosti. Do budoucna to může být i o poznání užitečnější, ale patrně nikdy nepůjde o obecnou náhradu za univerzální JVM.