关于使用GraalVM打包java项目,生成各种原生应用的对比

GraalVM是一种新型的Java虚拟机,旨在提高Java应用程序的性能和可靠性。GraalVM的一个重要功能是可以将Java应用程序打包成本地可执行文件,而不是使用传统的Java虚拟机来运行应用程序。本文将比较使用GraalVM打包Java项目生成各种原生应用的差异。

赶时间的可以直接跳过中间的步骤,看最后面的对比结果表格。

本文对应的源码,放在这里:GitHub – guwan/java-native-compare: Comparison of using GraalVM to package Java projects and generate various native applications.

需要注意一点的是,本文的启动时间均是首次程序的启动时间。所有的例子后续启动时间都会下降,但都是启动时间都是变化的,所以我认为不如首次启动这个标准有效。

  1. 最简单的 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库。这使得生成的可执行文件相对较大。因为已经编译成二进制了,所以启动较快。

  1. 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 做了大量优化吧。

  1. 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协议,因此生成的可执行文件也更大。

  1. 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

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注