[DOCKER] Versuchen Sie, Java mit GraalVM in ein natives Modul zu integrieren

Einführung

Endlich wurde GraalVM 1.0 RC veröffentlicht! https://blogs.oracle.com/developers/announcing-graalvm

Menschen in der Java-Welt wissen, dass es sich um die Plattform der nächsten Generation für AOT von Java 9 und JIT von Java 10 handelt, und Menschen, die Ruby sind, kennen es als explosive Ruby-Umgebung (Truffle Ruby).

Auf der offiziellen Website

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/

Der Zweck der VM-Umgebung besteht darin, eine einheitliche VM für alle Sprachen zu erstellen und Ressourcen wie Back-Tools und JIT zu verwenden. Ich habe die gleiche Idee wie [ORM] von IBM / Eclipse (https://www.eclipse.org/omr/starter/whatisomr.html).

Sie können viele interessante Dinge tun, aber eine der Funktionen ist, dass Sie JVM-basierte Sprachen nativ kompilieren können. Dies kann Java erheblich verbessern, das für seinen schlechten Platzbedarf beim Start bekannt ist. Es kann auch in einem einzigen Paket verpackt werden. Es gab ein nostalgisches Tool namens GCJ, als es darum ging, Java mit AOT zu kompilieren, um eine Binärdatei zu erstellen, aber es folgt nicht bereits dem neuesten Java, daher denke ich, dass es praktisch einzigartig ist.

Derzeit gibt es Community Edition und Enterprise Edition. Vorerst habe ich eine CE-Version der Docker-Umgebung erstellt, damit ich sie schnell ausprobieren kann, ohne sie zu installieren. Diesmal werde ich sie verwenden. https://hub.docker.com/r/koduki/docker-graalvm/

Zum nativen Modul erstellen

Lassen Sie uns einen einfachen Code in eine native Linux-Binärdatei einbauen. Der zu erstellende Code ist unten.

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

Überprüfen Sie mit dem folgenden Befehl die Versionsnummer, die gleichzeitig als Pull fungiert. Sie können sehen, dass es sich um eine Graal-VM handelt.

$ 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)

Dann wird es normalerweise in Java kompiliert und ausgeführt.

$ 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

Offensichtlich wurde es als "Hallo Welt" angezeigt. Lassen Sie uns dies nun in eine Linux-Binärdatei kompilieren.

$ 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

Eine Binärdatei namens "Hallo Welt" wurde erstellt. Das Ausführungsergebnis ist ebenfalls dasselbe. Lassen Sie uns nun den Unterschied im Start-Footprint sehen, da es sich um eine native Binärdatei handelt.

Über dem Docker ist der Overhead groß. Gehen Sie also in den Docker und überprüfen Sie.

$ 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

Sie können sehen, dass die Binärversion schneller arbeitet. Da dies einfach durchzuführen ist, können Sie sich dies als einen Unterschied im Overhead vorstellen, z. B. beim Start der VM und nicht als Ausführungsgeschwindigkeit.

Zusammenfassung

Vorerst habe ich versucht, Java mit dem Native-Image von GraalVM in eine Binärdatei zu integrieren. Obwohl es nicht im Artikel geschrieben ist, kann es als Ersatz für Fat-Jar verwendet werden, da es eine Binärdatei auch für mehrere Klassen richtig macht.

Es funktioniert nicht beim Laden dynamischer Module, wie @sonodar im Artikel "Ich habe GraalVM ausprobiert" versucht hat. Es scheint also schwierig zu sein, eine Webanwendung, die Spring Boot usw. verwendet, mit einer einzigen Binärdatei anstelle von Fat-Jar auszuführen. Im Moment.

Da der Platzbedarf jedoch kleiner geworden ist, ist es für mich ein großer Vorteil, die Erstellung von CLI-Tools in JVM-basierten Sprachen wie Scala zu vereinfachen. Skripte sind in Ordnung, aber das Schreiben in Java ist auch für Betreuer bequem zu sammeln. Ich möchte das Verhalten in Kombination mit einigen Bibliotheken überprüfen.

Da es sich bei diesem Artikel um die CE-Version handelt, versuche ich es unter Linux, aber ich konnte den Mac problemlos auf der EE-Version erstellen. Wenn Sie Windows damit abdecken können, können Sie anscheinend verschiedene Dinge tun.

Dann viel Spaß beim Hacken!

Recommended Posts

Versuchen Sie, Java mit GraalVM in ein natives Modul zu integrieren
Versuchen Sie, ein Java-Programm mit VS-Code zu debuggen
Führen Sie Scala mit GraalVM aus und machen Sie es zu einem nativen Image
Versuchen Sie eine DB-Verbindung mit Java
Versuchen Sie gRPC mit Java, Maven
Java-Programm zum Ändern der Größe eines Fotos in ein Quadrat mit Rändern
[Anfänger] Versuchen Sie, mit Java ein einfaches RPG-Spiel zu erstellen ①
Erstellen eines Java-Projekts mit Gradle
Versuchen Sie, den Start von Java-Konsolenprogrammen mit dem nativen Image von GraalVM zu beschleunigen
Versuchen Sie es mit Redis mit Java (jar)
Versuchen Sie die bidirektionale Kommunikation mit gRPC Java
Probieren wir WebSocket mit Java und Javascript aus!
Versuchen Sie, Kubernetes Job von Java aus auszuführen
Lassen Sie uns eine Taschenrechner-App mit Java erstellen
Teilen Sie eine Zeichenfolge in Java mit ". (Dot)"
Versuchen Sie, Java-Bibliotheken mit AWS CodeArtifact zu verwalten
Versuchen Sie es mit der Wii-Fernbedienung in Java
[Java] Modul
Versuchen Sie, Express + PostgreSQL + Sequelize mit Docker zu erstellen [Teil 2]
Führen Sie Rust von Java mit JNA (Java Native Access) aus.
Lesen Sie eine Zeichenfolge in einer PDF-Datei mit Java
Erstellen Sie eine CSR mit erweiterten Informationen in Java
Erstellen Sie mit Java + MySQL ein einfaches Bulletin Board
[Windows] [IntelliJ] [Java] [Tomcat] Erstellen Sie mit IntelliJ eine Umgebung für Tomcat 9
Lassen Sie uns mit Javas Timer einen zeitgesteuerten Prozess erstellen! !!
Versuchen Sie, ein Bulletin Board in Java zu erstellen
Versuchen Sie, Ruby und Java in Dapr zu integrieren
[Java] Erstellen Sie eine Sammlung mit nur einem Element
Versuchen Sie, Express + PostgreSQL + Sequelize mit Docker zu erstellen [Teil 1]
Bereiten Sie eine Scraping-Umgebung mit Docker und Java vor
Versuchen Sie, TCP / IP + NIO mit JAVA zu implementieren
Ich habe versucht, den Block mit Java zu brechen (1)
Erstellen Sie eine Java-Entwicklungsumgebung mit VS Code