GraalVM是一种新型的Java虚拟机,旨在提高Java应用程序的性能和可靠性。GraalVM的一个重要功能是可以将Java应用程序打包成本地可执行文件,而不是使用传统的Java虚拟机来运行应用程序。本文将比较使用GraalVM打包Java项目生成各种原生应用的差异。
赶时间的可以直接跳过中间的步骤,看最后面的对比结果表格。
需要注意一点的是,本文的启动时间均是首次程序的启动时间。所有的例子后续启动时间都会下降,但都是启动时间都是变化的,所以我认为不如首次启动这个标准有效。
- 最简单的 hello world
最简单的Hello World应用程序只是输出一行文本。
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
使用GraalVM将这个应用程序打包成本地可执行文件只需要两个简单的步骤。
javac HelloWorld.java
native-image HelloWorld
使用GraalVM打包Hello World应用程序的时间约为29.1秒,
生成的可执行文件大小约为12MB。
启动相对于传统jar包就快来很多,只需124毫秒。
使用GraalVM打包时,GraalVM会将应用程序的所有依赖项都打包进可执行文件中,包括JVM和Java库。这使得生成的可执行文件相对较大。因为已经编译成二进制了,所以启动较快。
- Spring Boot版的 hello world
Spring Boot是一个非常流行的Java框架,它可以帮助开发人员快速构建Java应用程序。使用Spring Boot构建的Hello World应用程序与传统的Hello World应用程序相比更为复杂。因此,使用GraalVM将Spring Boot应用程序打包成本地可执行文件需要更多的时间。
使用GraalVM打包Spring Boot版Hello World应用程序的时间约为1分 14秒。
生成的可执行文件大小约为35MB。
首次启动时间为54毫秒,比较意外的是比最简单的Hello World启动时间更短。
Spring Boot应用程序更为复杂,包含了大量的依赖项和库,需要更长时间来打包。此外,由于Spring Boot应用程序包含了许多依赖项,因此生成的可执行文件也更大。启动时间更短我想是因为spring 做了大量优化吧。
- Spring Boot Web
Spring Boot Web版Hello World应用程序是一种更为复杂的应用程序,它可以通过Web浏览器访问。使用GraalVM将Spring Boot Web应用程序打包成本地可执行文件需要更多的时间和资源。
使用GraalVM打包Spring Boot Web版Hello World应用程序的时间约为107秒,
生成的可执行文件大小约为68MB。
首次启动时间为176毫秒。
因为Spring Boot Web应用程序包含了更多的依赖项和库,需要更多的时间来打包。此外,由于Web应用程序需要支持HTTP协议,因此生成的可执行文件也更大。
- Spring Boot Web & Spring Boot JPA
Spring Boot Web & Spring Boot JPA版应用程序是一种更为复杂的应用程序,它包含了Web和数据库访问功能。实际进行企业应用开发时,我们的应用更接近于这个版本的程序,因为都会和这个版本一样,具有访问数据库和对外开发接口的能力。我在将这个版本的程序打包成原生应用时,也遇到些挫折,从spring starter下载JPA的例子无法直接打包成原生应用,将它使用的hibernate插件降级成6.1.7.final才运行成功。证明Spring boot native项目的流行度还不够,bug的及时处理速度和spring boot等流行模块不能比。
id 'org.hibernate.orm' version '6.1.7.Final'
使用GraalVM打包Spring Boot Web & Spring Boot JPA版Hello World应用程序的时间约为231秒,
生成的可执行文件大小约为133MB,并且会生成9个运行时必须的dll文件。
首次启动耗时:246毫秒。
这是因为Spring Boot Web & JPA应用程序包含了更多的依赖项和库,需要更多的时间来打包。此外,由于该应用程序需要访问数据库,因此生成的可执行文件大小也更大。
综合来看,使用GraalVM将Java应用程序打包成本地可执行文件可以提高应用程序的性能和可靠性,但也会增加生成可执行文件的时间和大小。对于简单的Hello World应用程序,生成时间和可执行文件大小仍然较小。但是,对于更为复杂的应用程序,如Spring Boot Web & JPA应用程序,生成时间和可执行文件大小会显著增加。因此,在使用GraalVM打包Java应用程序时,需要权衡应用程序的大小和性能,并选择最适合的打包方式。
打包时间(秒) | 启动时间(毫秒) | 原生应用大小MB | 传统jar包大小MB | |
Hello World | 29 | 124 | 12 | 无jar包,大小1k |
Spring Boot | 74 | 54 | 37 | 9 |
Spring Web | 107 | 176 | 68 | 19 |
Spring Web&JPA | 231 | 246 | 133 | 43 |
总结:从上面的表格我们可以看到:应用打包的时间和包大小大幅度提升了,启动时间缩短了大幅度降低。
我评估exe执行时间的命令行
Measure-Command {start-process D:\git\java-native-compare\plain\helloworld.exe -Wait}
电脑配置等可能影响生成应用的时间和大小,下面我贴出我的电脑配置,仅供参考:
处理器:Intel(R) Core(TM) i5-10500 CPU @ 3.10GHz 3.10 GHz
内存:16.0 GB (15.8 GB 可用)
操作系统: windows10
本文暂时没有评论,来添加一个吧(●'◡'●)