GraalVM est connu pour compiler Java en petits exécutables natifs qui démarrent beaucoup plus rapidement que les programmes Java traditionnels. La version 22.2 par Oracle Labs résout un problème de longue date en introduisant un référentiel de configuration pour les bibliothèques Java. La compilation Java native utilise moins de mémoire, et la distribution GraalVM fonctionne mieux sur Apple Silicon et est plus petite.
La compilation native rend Java plus compétitif dans le cloud. Quarkus, Micronaut et Helidon prennent en charge GraalVM en production aujourd'hui. Spring 6 et Spring Boot 3 prévoient de le faire d'ici la fin de cette année. InfoQ a publié une série d'articles sur ce sujet.
Pourquoi GraalVM a-t-il besoin d'un référentiel de configuration ? Contrairement à Java standard, les exécutables Java natifs ne peuvent pas charger dynamiquement de nouveau code lors de l'exécution. C'est pourquoi le compilateur natif "Native Image" de GraalVM doit connaître toutes les classes, méthodes et champs utilisés lors de l'exécution ("hypothèse du monde fermé"). Native Image le détecte automatiquement grâce à une analyse d'accessibilité. Mais les fonctionnalités Java dynamiques telles que la réflexion et les proxys cachent une partie du code de cette analyse. Les applications et les bibliothèques dotées de ces fonctionnalités dynamiques doivent fournir des indications de configuration à Native Image, sinon elles ne fonctionneront pas du tout en Java natif.
Jusqu'à présent, les développeurs Java devaient fournir ces indications pour les bibliothèques qui n'étaient pas livrées avec leur framework Java prenant en charge GraalVM. Le Référentiel de métadonnées d'accessibilité GraalVM promet de supprimer ce fardeau : GraalVM 22.2 lit les indications (renommés en "métadonnées d'accessibilité") à partir de ce nouveau référentiel central. Il s'agit d'une collaboration entre GraalVM, Micronaut, Spring Boot et Quarkus et accueille les contributions.
Native Image utilise désormais moins de RAM lors de la compilation. Par exemple, la création de l'application Spring PetClinic n'utilise que 2 Go. Les environnements CI ou les services cloud à mémoire limitée, comme les actions GitHub, bénéficient de cette réduction des ressources.
Native Image compile non seulement les langages JVM tels que Java, Scala ou Kotlin, mais également JavaScript, Python, Ruby, R et WebAssembly. Python a obtenu un interpréteur de bytecode expérimental avec un démarrage plus rapide et de meilleures performances dans cette version. L'interopérabilité de JavaScript avec des objets d'autres langages s'est améliorée.
La distribution GraalVM est plus petite car plus modulaire. Il n'inclut plus les runtimes pour JavaScript et LLVM ou VisualVM. Sous Linux, cela réduit la taille de la distribution Java 17 GraalVM de 42 % - de 431 Mo à 251 Mo.
Avec la version 22.2, les exécutables Java natifs peuvent vider le tas de mémoire dans un fichier, comme le peuvent les applications Java traditionnelles. C'est possible de trois manières : en appelant une API d'exécution, en envoyant un signal du système d'exploitation à l'application ou en quittant. La version comprend également une analyse d'échappement plus rapide lors de la compilation, un débogage amélioré sous Linux et une optimisation expérimentale strip mining pour les boucles comptées.
L'édition commerciale GraalVM Enterprise bénéficie désormais d'un support expérimental d'Apple Silicon, qui était inclus dans l'édition communautaire avec la sortie de GraalVM 22.1 en avril de cette année. D'autres composants GraalVM prennent désormais également en charge Apple Silicon dans les deux éditions, tels que JavaScript, LLVM, Ruby, Java sur la machine virtuelle Truffle et WebAssembly. L'édition Entreprise peut également inclure une Software Bill of Materials (SBOM) au format CycloneDX dans l'exécutable natif.
OpenJDK gère l'évolution du langage Java. Mais GraalVM ne fait pas partie d'OpenJDK car il appartient à Oracle Labs. Néanmoins, GraalVM restera la seule option pour Java natif dans les années à venir, car OpenJDK a retardé ses plans Java natifs du projet Leyden.