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/
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.
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