Mac下使用GraalVM和SpringBoot3.1构建本地应用-简单对比
构建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多岁的语言将会继续再创辉煌。