GraalVM 文档地址:https://www.graalvm.org/latest/docs/getting-started/
GraalVM Native Image 文档地址:https://www.graalvm.org/latest/reference-manual/native-image/
既然是VM,那肯定也是一个虚拟机,那它跟JVM有关系吗?有一定关系,GraalVM
可以完全取代上面提到的那几种虚拟机,比如 HotSpot
。把你之前运行在 HotSpot
上的代码直接平移到 GraalVM
上,不用做任何的改变,甚至都感知不到,项目可以完美的运行。但是 GraalVM
还有更广泛的用途,不仅支持 Java
语言,还支持其他语言。这些其他语言不仅包括嫡系的 JVM
系语言,例如 Kotlin
、Scala
,还包括例如 JavaScript、Nodejs、Ruby、Python
等,如图。
在这里插入图片
图片来自:https://www.graalvm.org/latest/docs/introduction/
GraalVM Native Image 是GraalVM 提供的一种能够将Spring Boot 程序打包成云原生可执行文件的技术,并且比JVM 占用更少的内存和更快的启动速度,非常适合使用容器部署和在Faas平台使用。
与在JVM运行的应用程序不同,GraalVM Native Image需要提前对代码进行编译处理才能创建可执行文件,GraalVM Native Image 的运行不需要提供JVM虚拟机。
有两种办法创建原生应用程序:
使用GraalVM Native 构建工具生成一个可执行文件
使用Cloud Native Buildpacks来生成一个包含可执行应用程序的轻量级容器
下面示例使用GraalVM Native来构建,java版本为17。
下载完成,然后解压。
变量值就是 graalvm的安装目录
验证安装成功没有。
java -version
D:\IdeaProjects\mytools\chatgpt>java -version
openjdk version "17.0.6" 2023-01-17
OpenJDK Runtime Environment GraalVM CE 22.3.1 (build 17.0.6+10-jvmci-22.3-b13)
OpenJDK 64-Bit Server VM GraalVM CE 22.3.1 (build 17.0.6+10-jvmci-22.3-b13, mixed mode, sharing)D:\IdeaProjects\mytools\chatgpt>
如果没有安装该工具,maven 在打包的时候会自动下载,但建议提前安装打包工具
gu install native-image
由于在线安装很慢可以使用离线安装。
2. 安装命令
gu install -L C:\Users\zhubayi\Downloads\native-image-installable-svm-java17-linux-amd64-22.3.1.jar
注意:
-L 后面就是native-image
文件的路径
3.查看安装成功没有
gu list
C:\Users\zhubayi>gu list
ComponentId Version Component name Stability Origin
---------------------------------------------------------------------------------------------------------------------------------
graalvm 22.3.1 GraalVM Core Supported
native-image 22.3.1 Native Image Early adopter github.com
因为要编译成指定本地可执行文件,比如exe,需要Windows安装了Microsoft Visual C++ (MSVC),
MAC 需要安装xcode,通过xcode-select --install
,
Linux sudo yum install gcc glibc-devel zlib-devel
Ubuntu sudo apt-get install build-essential libz-dev zlib1g-dev
其他Linux sudo dnf install gcc glibc-devel zlib-devel libstdc++-static
这里以Windows为例,安装 Visual Studio 2022 或更高版本的 构建工具和 Windows 10 SDK
可以参考我这篇博客:https://blog.csdn.net/qq_44732146/article/details/128877510
1、选择Java 17 版本
2、选择GraalVM Native Support、Spring Web
pom.xml文件
4.0.0 org.springframework.boot spring-boot-starter-parent 3.0.4 com.zhubayi graalvm-demo 0.0.1-SNAPSHOT graalvm-demo graalvm-demo 17 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test org.graalvm.buildtools native-maven-plugin org.springframework.boot spring-boot-maven-plugin
3、写一个简单的controller
@RestController
public class TestController {@RequestMapping("/")String home() {return "Hello World!";}
}
4、打包可执行文件
在 安装VS 中找到 x64 Native Tools Command Prompt 或者**终端**执行如下命令
mvn -Pnative native:compile
一共7个步骤,花费了差不多2分钟打包完,生成的可执行文件在target目录
5、运行可执行文件
双击exe文件,Spring Boot 应用程序几乎瞬间启动完毕,文件大小有68M左右,对于一个没什么业务代码的demo来说,确实太大了,但是启动速度很快!。
访问地址http://localhost:8080/
,能正常访问
从这个例子看出,使用GraalVM Spring Boot
的启动时间确实快了很多,但同时包也大了很多 ,有点空间换时间的意思。如果要打包原生可执行文件的话,环境配置也比较繁琐。不过使用GraalVM 来替代JVM 跑Java 程序还是很值得尝试的。