今天,来一起看一下,如何基于graalvm中的原生镜像来跑一个名为HelloWorld的Java程序。
首先,我们准备一个名称为HelloWorld.java的文件,如下所示。
lwk@qwfys:~/Public/project/gitee/graalvm$ ll
total 12
drwxrwxr-x 2 lwk lwk 4096 Sep 28 12:11 ./
drwxrwxr-x 5 lwk lwk 4096 Sep 25 02:05 ../
-rw-rw-r-- 1 lwk lwk 116 Sep 28 12:08 HelloWorld.java
lwk@qwfys:~/Public/project/gitee/graalvm$
文件的内容为:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
这是一个比较简单的HelloWorld Java程序。
编译之前,我们先给大家确认一下java版本,命令如下:
lwk@qwfys:~/Public/project/gitee/graalvm$ java --version
openjdk 11.0.12 2021-07-20
OpenJDK Runtime Environment GraalVM CE 21.2.0 (build 11.0.12+6-jvmci-21.2-b08)
OpenJDK 64-Bit Server VM GraalVM CE 21.2.0 (build 11.0.12+6-jvmci-21.2-b08, mixed mode, sharing)
lwk@qwfys:~/Public/project/gitee/graalvm$
话不多说,我们接下来编译一下文件HelloWorld.java命令如下:
lwk@qwfys:~/Public/project/gitee/graalvm$ javac HelloWorld.java
lwk@qwfys:~/Public/project/gitee/graalvm$ ll
total 16
drwxrwxr-x 2 lwk lwk 4096 Sep 28 12:11 ./
drwxrwxr-x 5 lwk lwk 4096 Sep 25 02:05 ../
-rw-rw-r-- 1 lwk lwk 427 Sep 28 12:11 HelloWorld.class
-rw-rw-r-- 1 lwk lwk 116 Sep 28 12:08 HelloWorld.java
lwk@qwfys:~/Public/project/gitee/graalvm$
我们先简单运行下,命名如下:
lwk@qwfys:~/Public/project/gitee/graalvm$ java HelloWorld
Hello, World!
lwk@qwfys:~/Public/project/gitee/graalvm$
接下来,我们基于刚才生成的HelloWorld.class文件生成相应的原生镜像,也就是平台相关的CPU相关的二进制文件,命名如下:
lwk@qwfys:~/Public/project/gitee/graalvm$ native-image HelloWorld
[helloworld:95671] classlist: 1,162.25 ms, 0.96 GB
[helloworld:95671] (cap): 456.12 ms, 0.96 GB
[helloworld:95671] setup: 1,852.26 ms, 0.96 GB
[helloworld:95671] (clinit): 160.11 ms, 1.74 GB
[helloworld:95671] (typeflow): 3,917.39 ms, 1.74 GB
[helloworld:95671] (objects): 3,060.04 ms, 1.74 GB
[helloworld:95671] (features): 325.85 ms, 1.74 GB
[helloworld:95671] analysis: 7,696.68 ms, 1.74 GB
[helloworld:95671] universe: 672.44 ms, 1.74 GB
[helloworld:95671] (parse): 677.94 ms, 1.77 GB
[helloworld:95671] (inline): 1,025.42 ms, 2.36 GB
[helloworld:95671] (compile): 7,739.75 ms, 2.40 GB
[helloworld:95671] compile: 9,915.98 ms, 2.40 GB
[helloworld:95671] image: 1,357.51 ms, 2.40 GB
[helloworld:95671] write: 182.67 ms, 2.40 GB
[helloworld:95671] [total]: 23,053.74 ms, 2.40 GB
# Printing build artifacts to: /home/lwk/Public/project/gitee/graalvm/helloworld.build_artifacts.txt
lwk@qwfys:~/Public/project/gitee/graalvm$ ll
total 11168
drwxrwxr-x 2 lwk lwk 4096 Sep 28 12:12 ./
drwxrwxr-x 5 lwk lwk 4096 Sep 25 02:05 ../
-rwxrwxr-x 1 lwk lwk 11412048 Sep 28 12:12 helloworld*
-rw-rw-r-- 1 lwk lwk 25 Sep 28 12:12 helloworld.build_artifacts.txt
-rw-rw-r-- 1 lwk lwk 427 Sep 28 12:11 HelloWorld.class
-rw-rw-r-- 1 lwk lwk 116 Sep 28 12:08 HelloWorld.java
lwk@qwfys:~/Public/project/gitee/graalvm$
我们看到已经生成了一个名称为helloworld的可执行文件,接下来,我们可以直接运行它,命令如下:
lwk@qwfys:~/Public/project/gitee/graalvm$ ./helloworld
Hello, World!
lwk@qwfys:~/Public/project/gitee/graalvm$
最后,我们再看一下,刚才生成的文件中,还有一个名称为helloworld.build_artifacts.txt的文件,我们看里面都一些什么,命令如下:
lwk@qwfys:~/Public/project/gitee/graalvm$ cat helloworld.build_artifacts.txt
[EXECUTABLE]
helloworld
lwk@qwfys:~/Public/project/gitee/graalvm$
至此,我们就完成了一个简单的实验。