[DOCKER] Essayez de créer Java dans un module natif avec GraalVM

introduction

Enfin, GraalVM 1.0 RC est sorti! https://blogs.oracle.com/developers/announcing-graalvm

Les gens du monde Java savent qu'il s'agit de la plate-forme de nouvelle génération autour de AOT de Java 9 et JIT de Java 10, et les gens qui sont Ruby le connaissent comme un environnement Ruby explosif (Truffle Ruby).

Sur le site officiel

GraalVM is a universal virtual machine for running applications written in JavaScript, Python 3, Ruby, R, JVM-based languages like Java, Scala, Kotlin, and LLVM-based languages such as C and C++. https://www.graalvm.org/

Le but de l'environnement de machine virtuelle est de créer une machine virtuelle unifiée pour toutes les langues et d'utiliser des ressources telles que les outils de retour et JIT. Je ressens la même idée que [ORM] d'IBM / Eclipse (https://www.eclipse.org/omr/starter/whatisomr.html).

Vous pouvez faire beaucoup de choses intéressantes, mais l'une des fonctionnalités est que vous pouvez compiler nativement des langages basés sur JVM. Cela peut considérablement améliorer Java, célèbre pour sa mauvaise empreinte au démarrage. Il peut également être emballé dans un seul emballage. Il y avait un outil nostalgique appelé GCJ lorsqu'il s'agissait de compiler AOT Java pour créer un binaire, mais il ne suit pas déjà la dernière version de Java, donc je pense que c'est pratiquement unique.

Actuellement, il existe Community Edition et Enterprise Edition. Pour le moment, j'ai créé une version CE de l'environnement Docker afin de pouvoir l'essayer rapidement sans l'installer, donc je vais l'utiliser cette fois. https://hub.docker.com/r/koduki/docker-graalvm/

Construire vers un module natif

Construisons un code simple dans un binaire natif Linux. Le code à construire est ci-dessous.

public class HelloWorld {
  public static void main(String args[]){
    System.out.println("Hello, World");
  }
}

Vérifiez le numéro de version qui se double de Pull avec la commande suivante. Vous pouvez voir qu'il s'agit d'une machine virtuelle Graal.

$ docker run -it -v "`pwd`:/src" koduki/graalvm:1.0.0-rc1  java -version
openjdk version "1.8.0_161"
OpenJDK Runtime Environment (build 1.8.0_161-12)
GraalVM 1.0.0-rc1 (build 25.71-b01-internal-jvmci-0.42, mixed mode)

Ensuite, il est généralement compilé et exécuté en Java.

$ docker run -it -v "`pwd`:/src" koduki/graalvm:1.0.0-rc1 javac HelloWorld.java
$ docker run -it -v "`pwd`:/src" koduki/graalvm:1.0.0-rc1 java Hello, World

De toute évidence, il était affiché comme «Hello, World». Maintenant, compilons ceci dans un binaire Linux.

$ docker run -it -v "`pwd`:/src" koduki/graalvm:1.0.0-rc1 native-image HelloWorld
Build on Server(pid: 9, port: 26681)*
   classlist:   4,335.15 ms
       (cap):   1,257.90 ms
       setup:   3,411.13 ms
  (typeflow):  12,345.25 ms
   (objects):   3,497.83 ms
  (features):      89.48 ms
    analysis:  16,130.07 ms
    universe:     541.30 ms
     (parse):   4,822.63 ms
    (inline):   2,370.80 ms
   (compile):  20,626.56 ms
     compile:  28,372.55 ms
       image:   1,507.64 ms
       write:     489.70 ms
     [total]:  54,945.94 ms
$ docker run -it -v "`pwd`:/src" koduki/graalvm:1.0.0-rc1 ./helloworld
Hello, World

Un binaire appelé «hello world» a été créé. Le résultat de l'exécution est également le même. Voyons maintenant la différence dans l'empreinte de démarrage car il s'agit d'un binaire natif.

Au-dessus du Docker, la surcharge est importante, alors allez dans le Docker et vérifiez.

$ docker run -it -v "`pwd`:/src" koduki/graalvm:1.0.0-rc1  /bin/bash
[root@d16c0ed04d03 src]# time java HelloWorld
Hello, World

real	0m0.167s
user	0m0.070s
sys	0m0.070s
[root@d16c0ed04d03 src]# time ./helloworld 
Hello, World

real	0m0.031s
user	0m0.000s
sys	0m0.000s

Vous pouvez voir que la version binaire fonctionne plus rapidement. Comme il est simple à faire, vous pouvez considérer cela comme une différence de frais généraux telle que le démarrage de la VM plutôt que la vitesse d'exécution.

Résumé

Pour le moment, j'ai essayé de construire Java dans un binaire en utilisant l'image native de GraalVM. Bien qu'il ne soit pas écrit dans l'article, il peut être utilisé comme substitut de fat-jar car il crée correctement un binaire même pour plusieurs classes.

Cela ne fonctionne pas avec le chargement de module dynamique comme @sonodar a essayé dans l'article "J'ai essayé GraalVM" Il semble donc difficile d'exécuter une application Web qui utilise Spring Boot, etc. avec un seul binaire au lieu de fat-jar. En ce moment.

Cependant, étant donné que l'encombrement est devenu plus petit, c'est tout à fait un mérite pour moi de faciliter la création d'outils CLI dans des langages basés sur JVM tels que Scala. Les scripts sont bien, mais l'écriture en Java est également pratique à collecter pour les responsables. Je voudrais vérifier le comportement en combinaison avec certaines bibliothèques.

De plus, comme cet article est la version CE, je l'essaie sous Linux, mais j'ai pu construire le Mac sur la version EE sans aucun problème. Si vous pouvez couvrir Windows avec cela, il semble que vous puissiez faire différentes choses.

Alors Happy Hacking!

Recommended Posts

Essayez de créer Java dans un module natif avec GraalVM
Essayez de déboguer un programme Java avec VS Code
Exécutez Scala avec GraalVM et créez-en une image native
Essayez la connexion DB avec Java
Essayez gRPC avec Java, Maven
Programme Java pour redimensionner une photo dans un carré avec des marges
[Débutant] Essayez de créer un jeu RPG simple avec Java ①
Construire un projet Java avec Gradle
Essayez d'accélérer le démarrage des programmes de console Java avec l'image native de GraalVM
Essayez d'utiliser Redis avec Java (jar)
Essayez la communication bidirectionnelle avec gRPC Java
Essayons WebSocket avec Java et javascript!
Essayez d'exécuter Kubernetes Job à partir de Java
Créons une application de calcul avec Java
Diviser une chaîne avec ". (Dot)" en Java
Essayez de gérer les bibliothèques Java avec AWS CodeArtifact
Essayez d'utiliser la télécommande Wii en Java
Module [Java]
Essayez de créer Express + PostgreSQL + Sequelize avec Docker [Partie 2]
Exécuter Rust depuis Java avec JNA (Java Native Access)
Lire une chaîne dans un fichier PDF avec Java
Créer un CSR avec des informations étendues en Java
Créez un tableau d'affichage simple avec Java + MySQL
[Windows] [IntelliJ] [Java] [Tomcat] Créer un environnement pour Tomcat 9 avec IntelliJ
Créons un processus chronométré avec la minuterie de Java! !!
Essayez de créer un babillard en Java
Essayez d'intégrer Ruby et Java avec Dapr
[Java] Créer une collection avec un seul élément
Essayez de créer Express + PostgreSQL + Sequelize avec Docker [Partie 1]
Préparer un environnement de scraping avec Docker et Java
Essayez d'implémenter TCP / IP + NIO avec JAVA
J'ai essayé de casser le bloc avec java (1)
Créer un environnement de développement Java avec VS Code