利用GraalVM的AOT能力打包Java生成本地可执行程序
通过GraalVM打包Java生成本地可执行程序
前言
GraalVM 是一种高性能、多语言通用虚拟机和编译器技术。它由 Oracle 开发并开源,旨在为不同的编程语言和应用场景提供统一的运行时环境和编译器平台。以下是 GraalVM 的一些主要特点和功能:
- 多语言支持: GraalVM 支持多种编程语言,包括 Java、JavaScript(Node.js)、Python、Ruby、R、C 和 C++ 等。这使得开发者可以在同一平台上运行不同语言的代码,从而降低了开发和部署的复杂性。
- 高性能 JIT 编译器: GraalVM 包含了一款高性能的即时编译器,可以将 Java 代码编译成高效的本地机器码,从而提供更快的执行速度和较低的内存占用。
- AOT 编译: GraalVM 还支持 AOT(Ahead-Of-Time)编译,可以将 Java 代码编译成本地可执行文件,无需依赖 JVM。这有助于提高启动速度和减少内存消耗。
- 本地镜像生成: GraalVM 的本地镜像功能可以将 Java 应用程序和依赖项一起打包成本地可执行文件,无需 JVM(内部使用了SubVM)。这有助于简化部署,并减少应用程序的启动时间和资源占用。
- JIT 监控和分析: GraalVM 提供了丰富的监控和分析工具,可以帮助开发者了解 JIT 编译的情况,优化代码性能,以及识别潜在的性能瓶颈。
- 多语言互操作性: GraalVM 支持在不同语言之间进行互操作,例如在 Java 代码中调用 JavaScript 函数,或在 JavaScript 代码中调用 Java 类。
- 支持 WebAssembly: GraalVM 可以将 Java 代码编译成 WebAssembly 格式,使得 Java 应用程序可以在浏览器中运行。
- 开放源代码: GraalVM 是一个开放源代码项目,您可以在 GitHub 上找到它的源代码和文档。
GraalVM 在加速 Java 应用程序、支持多语言开发、优化资源使用等方面提供了一系列创新功能。它被广泛用于构建高性能的应用程序、微服务、嵌入式系统以及各种语言的运行时环境。
GraalVM打包本地镜像的好处
GraalVM 的本地镜像打包功能可以将 Java 应用程序及其依赖项打包成本地可执行文件,无需依赖 JVM,从而带来许多好处:
- 快速启动: 传统的 Java 应用程序需要加载 JVM 和运行时库,因此启动时间可能较长。而使用 GraalVM 本地镜像,应用程序被编译成本地机器码,可以直接运行在本地机器上,启动时间大幅缩短,适用于需要快速启动的场景,如命令行工具和无服务器应用。
- 内存占用减少: 传统的 Java 应用程序需要一定的内存来容纳 JVM 和运行时库。使用 GraalVM 本地镜像,应用程序仅加载所需的代码和依赖项,可以显著减少内存占用,有助于优化资源使用。
- 单一分发文件: 本地镜像将应用程序及其所有依赖项打包成一个可执行文件,便于分发和部署。这消除了对于目标系统是否已安装特定版本的 JVM 的依赖,简化了部署过程。
- 减少依赖: GraalVM 本地镜像中已经包含了应用程序的依赖项,因此无需手动安装和配置额外的依赖库。
- 更轻量: 本地镜像只包含应用程序和依赖项的精简版本,因此文件大小较小,减少了磁盘空间的使用。
- 无需 JVM 安装: 使用 GraalVM 本地镜像运行 Java 应用程序无需安装 JVM,这对于在容器化环境中运行应用程序非常有用,可以减小容器的镜像大小。
- 与云原生技术兼容: 本地镜像适用于云原生技术栈,如容器化和无服务器架构,能够更好地满足现代应用开发的需求。
GraalVM 的本地镜像打包功能为 Java 应用程序提供了更快的启动时间、更低的内存占用、更轻量级的分发文件等优势,适用于多种场景,特别是对于需要快速启动和优化资源的应用程序。
注意:
- GraalVM暂不支持交叉编译,只能编译本平台的可执行文件。
- 使用native-image工具进行本地编译可能会限制应用程序的一些动态特性和反射能力,因为GraalVM的AOT编译需要在编译时了解所有可能的代码路径。在某些情况下,可能需要对应用程序的代码进行调整,以便与GraalVM的编译要求相匹配。
- 另外,SpringBoot从3.0版本开始,拥有Sprng Native特性,支持GraalVM AOT打包。
一、准备测试程序
- 编写一个只包含hello world的源文件:GraalVMTest.java(注意不要有package语句)
import java.util.concurrent.TimeUnit;
/**
* @description:
* @author: Yang
* @since: 2023/9/15
*/
public class GraalVMTest {
public static void main(String[] args) throws InterruptedException {
System.out.println("Hello you...");
TimeUnit.SECONDS.sleep(40);
System.out.println("Bye bye you...");
}
}
- 利用javac命令,编译成class文件
javac GraalVMTest.java
- 利用java命令执行编译出的class文件,验证编译产物,看能否正常打印语句
java GraalVMTest
二、下载安装GraalVM
sdk list java
sdk install java 20.0.2-graal
sdk use java 20.0.2-graal
java -version
三、安装插件
- 查看已安装的Graal工具
gu list
- 安装native-image组件(按需安装,推荐用梯子,耗时较长)
gu install native-image
- 使用native-image将GraalVMTest.class打包生成本地可执行程序
native-image GraalVMTest
四、执行本地可执行文件
./graalvmtest
学习使我充实,分享给我快乐!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下