GraalVM, une machine virtuelle polyglotte qui fournit un environnement d'exécution partagé pour exécuter des applications écrites dans plusieurs langages, a publié sa version majeure 22.0 avec de nombreuses améliorations dans native image. L'utilitaire de création d'images natives mis à jour s'accompagne d'améliorations significatives pour accélérer les temps de création, réduire la taille des images et utiliser moins de mémoire pour créer et exécuter des images. Grâce aux commentaires de la communauté, les résultats de l'utilitaire fournissent désormais des informations approfondies sur le processus de génération d'images.
Le générateur d'images natives, native-image
, encode désormais les métadonnées de la pile dans un format compressé pour réduire la taille de l'image. De plus, l'édition entreprise utilise un String.format()
optimisé qui rend les classes de localisation inaccessibles le cas échéant, réduisant ainsi considérablement la taille des images.
Par défaut, les images natives générées utiliseront désormais le Serial Garbage Collector (Serial GC). Serial GC est optimisé pour une faible empreinte mémoire et de petites tailles de heap Java. Cela réduit le temps passé dans le GC et/ou la resident set size (RSS) de l'application. Notez que Serial GC est un bon choix pour les petits heaps. Pour les applications qui nécessitent des segments de mémoire plus importants, le GC G1 pourrait être un meilleur choix, mais n'est disponible que dans l'édition entreprise.
Avant cette version, il a été observé que les créations d'images natives ont tendance à être plus lentes, en particulier dans les environnements docker/kubernetes. Avec la version 22.0 et ultérieure, la sortie par défaut de native-image
fournit des informations clés tout au long du processus de génération d'image qui est divisé en plusieurs étapes.
Comme le montre la capture d'écran ci-dessus, la sortie est maintenant proprement séparée en plusieurs étapes avec des barres de progression, le cas échéant. Chaque *
dans la barre de progression est une itération de l'analyse effectuée lors de la génération de l'image. L'étape d'analyse des performances est un domaine clé pour identifier les erreurs de configuration. L'examen de la sortie peut aider l'utilisateur à trouver des classapth trop larges qui peuvent entraîner un grand nombre de classes et de méthodes inutilisées. La surutilisation potentielle de la réflexion peut également être identifiée à partir de la sortie. Comme on peut le deviner, retirer les jars inutilisés et éviter la réflexion lorsque cela est possible peut améliorer les temps de construction et réduire la taille des images. L'étape de création d'image est un autre domaine clé dont la sortie peut être revue pour réduire davantage la taille de l'image et accélérer les constructions. Un rapport d'utilisation des ressources est généré à la fin de la construction qui indique le temps passé dans le Garbage Collection, le pic RSS et la charge CPU. Toutes ces statistiques peuvent être utilisées pour accélérer les builds en ajustant la mémoire et la CPU disponibles. Le rapport généré peut également être analysé visuellement en le chargeant dans le tableau de bord GraalVM.
Et grâce à sa technique d'analyse en monde fermé, native-image
peut désormais détecter et signaler des failles de sécurité. Au cours de l'étape d'analyse des performances d'une compilation, toutes les failles de sécurité connues sur le classpath
seront signalées. La capture d'écran suivante montre la sortie de native-image
où elle signale l'utilisation d'une bibliothèque log4j non corrigée et les méthodes vulnérables.
Image Source: GraalVM 22.0 Release Stream
La prise en charge des images natives pour le système de modules de Java (Java Module System) a également été améliorée dans cette version. En plus de prendre en charge --add-reads
et --add-modules
, toutes les options liées au module sont désormais prises en compte avant de scanner le modulepath
. Ces améliorations aideront à prévenir les erreurs de chargement de classe et permettront une meilleure introspection des modules au moment de l'exécution.
Notez qu'il s'agit de la version finale où le native-image
peut être exécuté avec JDK 8. En fait, GraalVM 22.0 Enterprise Edition a abandonné la prise en charge du JDK 8 et est basé sur JDK 11 et JDK 17. Les versions Java de cette version de GraalVM community edition sont basées sur OpenJDK 11.0.14 et OpenJDK version 17.0.2.
GraalVM 22.0 inclut également des optimisations nouvelles et mises à jour du compilateur comme le partial unrolling, l'inlining, la duplication et la vectorization. L'édition entreprise a une nouvelle optimisation de loop rotation qui est désactivée par défaut. Le compilateur Graal de l'édition entreprise peut désormais effectuer des optimisations même en l'absence de profils. Les éditions Community et Enterprise sont livrées avec une optimisation d'image native pour les instructions switch qui utilisent les branches instanceof
.
Comme d'habitude, cette version de GraalVM est livrée avec des améliorations de compatibilité et d'exécution dans ses distributions Python, R, Ruby et LLVM. La mise en œuvre par GraalVM de WebAssembly et Java on Truffle ont tous deux amélioré leur compatibilité avec le framework Truffle. La distribution Node.js de GraalVM a été mise à jour vers 14.18.1. Et JavaScript de GraalVM aura le mode et les fonctionnalités ECMAScript 2022 activés par défaut.
Enfin, la version GraalVM 22.0 est livrée avec GraalVM Extension Pack amélioré pour Visual Studio Code pour aider au développement et au débogage des applications basées sur GraalVM.