GraalVM的目标:构建更快、更小、更具有竞争力的应用

构建native应用

参考上一篇文章,Mac下使用GraalVM和SpringBoot3.1构建本地应用

需要注意的是,本次将mybatis-plus更换成了spring-data-jdbc用于测试(因为截止2023-06-17其仍旧未支持AOT编译)

编译方式与前文一致

# 编译并打包
mvn clean package -Pnative

# AOT编译为本地可执行文件(当前操作系统类型)
mvn native:compile-no-fork

1. 构建产出物对比

构建打包截图

可见java普通打包是 26 MB; native的应用是 77 MB。

本地打包应用的磁盘空间占用是普通jar包的 3 倍还多一点。当然,考虑到普通jar包是跨平台的并不能单独运行,必须要安装jdk,而jdk本身安装包就要262MB,安装后占用空间将至少有800MB。而native方式的应用,虽然不能跨平台,但是不需要安装jdk。

因此对于单一应用而言,native方式的磁盘空间占用则相当于只占原 java应用+jdk 的 10%,磁盘空间占用成本缩减的非常明显。

2. 启动时间对比

使用java命令行启动该SpringBoot应用

java -jar zentao-task-0.0.1-SNAPSHOT.jar --server.port=9090

启动结果截图

可以看到使用java方式运行时其启动时间为 2.92 秒

使用native方式启动该SpringBoot应用

./zentao-task --server.port=9090

启动结果截图

可以看到使用native方式运行时其启动时间仅为 0.45 秒

启动耗时比较结果

java方式运行时其启动时间为 2.92 秒 native方式运行时其启动时间为 0.45 秒

从启动耗时上,native方式的应用启动耗时仅是java命令方式启动耗时的20%,有了接近 6.5 倍的加速!

3. 运行时内存对比

使用java命令行方式运行内存 内存占用截图

使用native方式运行内存 内存占用截图

运行内存比较结果

java命令行运行方式占用 138.7 MB;native运行方式 58.9 MB。 从运行内存占用上,native方式内存占用仅是java命令行方式内存占用的 42.5% ,节约内存提升非常明显。

总结

尽管这个对比是个非常简单的应用,但是使用GraalVM编译为本地应用的时候,无论从磁盘空间占用、启动时间、运行内存占用还是运行效率上来说都有非常大的提升。对于云上容器化来说,还是相当节约资源的。

由于java语言具有丰富的生态环境,开源项目和开发者众多,一旦大部分开源项目都支持了GraalVM的native方式,那么java这门20多岁的语言将会继续再创辉煌。