UNIXwork

GraalVM Native Image

19. April 2018

GraalVM kann aus Java-Bytecode ein natives Image, also nativen Maschinencode, erstellen. Damit erhält man ein normales Executable, das keine Abhängigkeit zur JVM hat, deutlich schneller startet und einen geringeren Ressourcenverbrauch hat.

Zum Test erstellen wir fix ein einfaches Java Hello World.

Hello.java

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

Manifest.txt

Manifest-version: 1.0
Main-Class: Hello

Java-Code kompilieren und jar erstellen:

$ javac Hello.java
$ jar cfm Hello.jar Manifest.txt Hello.java
$ java -jar Hello.jar
Hello World!

Das native Image kann mit dem GraalVM-Tool native-image erstellt werden:

$ native-image -jar Hello.jar
Build on Server(pid: 8912, port: 26682)
   classlist:     350.53 ms
       (cap):     605.69 ms
       setup:     856.57 ms
  (typeflow):   4,224.92 ms
   (objects):   1,103.80 ms
  (features):      29.86 ms
    analysis:   5,452.54 ms
    universe:     195.50 ms
     (parse):     917.86 ms
    (inline):     783.22 ms
   (compile):   5,169.52 ms
     compile:   7,097.16 ms
       image:     437.47 ms
       write:     115.94 ms
     [total]:  14,536.87 ms
$ ./Hello
Hello World

Die erzeugte Executable ist mit 5,4 Mb nicht gerade klein, enthält aber auch alle verwendeten Teile der Java Runtime schon precompiled.

Die schlechte Nachricht ist, dass dies nicht mit allem funktioniert. Einige Klassen können offenbar nicht kompiliert werden. Bei meinem Versuch ein einfaches Swing-Beispiel zu kompilieren, wurde ich darauf hingewiesen, dass sun.misc.URLClassPath$JarLoader unsupported ist:

Build on Server(pid: 9251, port: 26682)*
   classlist:   1,526.88 ms
       (cap):     990.22 ms
       setup:   2,164.54 ms
    analysis:  19,376.53 ms
error: unsupported features in 3 methods
Detailed message:
Error: Must not have a started Thread in the image heap.
Trace:  object sun.java2d.opengl.OGLRenderQueue
    field sun.java2d.opengl.OGLRenderQueue.theInstance
Error: Unsupported type sun.misc.URLClassPath$JarLoader is reachable
...

Ergibt ja auch Sinn, dass ein JarLoader nicht mit reinem nativen Code ohne JVM funktioniert. Wer also hofft seine lieblings IDE, die dank Java fett und träge ist, zu einem schnellen nativen Kompilat umzuwandeln, der wird leider enttäuscht (und wehe mir sagt jemand, dass Visual Studio oder XCode gar nicht Java verwenden).

Autor: Olaf | 0 Kommentare | Tags: graalvm, java

Kommentare


Name
Webseite (optional)
Captcha: 3x=12   x=?
Kommentar