GraalVM vs Project Leyden : deux armes pour le même ennemi
Votre application Quarkus démarre en 2,7 secondes. C’est déjà honorable. Mais dans un contexte Kubernetes, avec des pods qui montent et descendent en boucle, 2,7 secondes c’est une éternité. Chaque démarrage, c’est du CPU gaspillé, des requêtes en attente, et un autoscaler qui stresse.
Sur la démo qui accompagne cet article (Quarkus 3.38.2, 105 jeux en base comme dataset, PostgreSQL sur volume Docker persistant, JDK 25 Corretto 25.0.3, que j’ai poussée sur GitHub pour que vous puissiez reproduire), je mesure 2,7 s sans cache contre 1,8 s avec le cache AOT Leyden : -35% en moyenne sur 5 runs benchmark.sh automatisés et archivés, sans toucher au code applicatif. Côté natif GraalVM, non mesuré sur cette démo : comptez quelques dizaines de millisecondes sur un REST minimal, plutôt quelques centaines sur une app chargée (17 ms et 242 ms d’après le blog Quarkus).
Il existe aujourd’hui deux approches pour régler ce problème de warmup JVM. Deux philosophies, deux compromis. L’une est mature et radicale (GraalVM Native Image). L’autre est pragmatique et en pleine ascension (Project Leyden). Je vous propose de trancher, chiffres de la démo à l’appui (spoiler : pour une majorité d’applis Quarkus en prod, la réponse n’est pas forcément GraalVM).