java~graalVM虚拟机

GraalVM

GraalVM 是一种高性能、通用的虚拟机,由 Oracle 公司开发。它支持多种编程语言(如 Java、JavaScript、Python 等),并提供了即时编译器、AOT 编译器等功能。GraalVM 的主要特点包括:

  1. 高性能:GraalVM 提供了优秀的即时编译器,能够将程序在运行时快速编译成本地代码,从而提高执行效率。
  2. 多语言支持:除了支持 Java 之外,GraalVM 还支持其他多种编程语言,可以在同一个虚拟机中运行不同语言的程序。
  3. AOT 编译:GraalVM 支持提前(Ahead of Time)编译,能够将程序编译成本地可执行文件,减少启动时间和内存占用。
  4. 嵌入式引擎:GraalVM 提供了 JavaScript 引擎,可以作为嵌入式引擎使用,方便在 Java 应用中执行 JavaScript 代码。
  5. 生态系统:GraalVM 生态系统丰富,支持各种工具和框架,如 GraalVM Native Image、Truffle 框架等。

总的来说,GraalVM 是一款功能强大、灵活多样的虚拟机,适合用于构建高性能、多语言混合的应用程序,并且在云计算、大数据等领域有着广泛的应用前景。

GraalVM 和 JVM 的关系

既然叫做VM,那肯定和 JVM 有关系的吧。JVM 全称 Java 虚拟机,我们都知道,Java 程序是运行在虚拟机上的,虚拟机提供 Java 运行时,支持解释执行和部分的(JIT)即时编译器,并且负责分配和管理 Java 运行所需的内存,我们所说的各种垃圾收集器都工作在 JVM 中。

比如 Oracle JDK、OpenJDK ,默认的 JVM 是 HotSpot 虚拟机,这是当前应用最广泛的一个虚拟机。我们平时见到的各种将虚拟机的书籍、文章、面试题,基本上都是说的 HotSpot 虚拟机。

除此之外,还有一些商用,或者说小众的虚拟机存在,比如IBM 的J9 JVM,商用的 Zing VM 等。

GraalVM 可以完全取代上面提到的那几种虚拟机,比如 HotSpot。把你之前运行在 HotSpot 上的代码直接平移到 GraalVM 上,不用做任何的改变,甚至都感知不到,项目可以完美的运行。

但是 GraalVM 还有更广泛的用途,不仅支持 Java 语言,还支持其他语言。这些其他语言不仅包括嫡系的 JVM 系语言,例如 Kotlin、Scala,还包括例如 JavaScript、Nodejs、Ruby、Python 等。

GraalVM 和JDK有什么关系

  • Java 虚拟机都是内置在 JDK 中的,比如Orcale JDK、OpenJDK,默认内置的都是 HotSpot 虚拟机,这是当前应用最广泛的一个虚拟机。
  • GraalVM 也是一种 JDK,一种高性能的 JDK。完全可以用它替代 OpenJDK、Orcale JDK。
  • GraalVM 可以完全取代上面提到的那几种虚拟机,比如 HotSpot。把你之前运行在 HotSpot 上的代码直接平移到 GraalVM 上,不用做任何的改变,甚至都感知不到,项目可以完美的运行。
  • GraalVM 还有更广泛的用途,不仅支持 Java 语言,还支持其他语言。这些其他语言不仅包括嫡系的 JVM 系语言,例如 Kotlin、Scala,还包括例如 JavaScript、Nodejs、Ruby、Python 等。

AOT编译

AOT(Ahead of Time)编译是一种在程序执行之前将代码编译成本地机器码的编译方式。与传统的 JIT(Just-In-Time)编译相对应,AOT 编译在程序运行之前就完成了编译过程,生成可执行文件,从而避免了运行时的即时编译开销。

AOT 编译的主要优点包括:

  1. 启动性能优化:AOT 编译可以将程序预先编译成本地机器码,减少了程序启动时的编译时间,加快了启动速度。

  2. 内存占用优化:AOT 编译可以减少运行时的内存占用,因为不需要在运行时再进行编译,节省了内存空间。

  3. 安全性提高:AOT 编译可以在编译时进行更多的静态分析和优化,提高了代码的安全性和稳定性。

然而,AOT 编译也存在一些缺点,比如失去了 JIT 编译的动态优化能力,可能导致一些无法被预测的性能问题;同时,AOT 编译会增加构建和部署的复杂性,因为需要提前确定编译目标平台等因素。

总的来说,AOT 编译适合于那些对启动速度和内存占用有较高要求的场景,比如移动应用、云原生应用等领域。在 GraalVM 等技术中,AOT 编译得到了广泛的应用,并取得了显著的效果。

springboot打包到graalVM镜像

要将 Spring Boot 程序打包成 Docker 镜像,并使用 GraalVM 作为基础镜像,可以按照以下步骤进行操作:

  1. 准备 Dockerfile:在项目根目录下创建一个名为 Dockerfile 的文件,内容如下所示:
# 使用 GraalVM 作为基础镜像
FROM oracle/graalvm-ce:latest

# 设置工作目录
WORKDIR /app

# 复制编译好的 Spring Boot 可执行文件到镜像中
COPY target/<your-spring-boot-jar>.jar app.jar

# 运行 Spring Boot 应用
CMD ["java", "-jar", "app.jar"]
  1. 构建 Spring Boot 可执行 JAR 文件:确保你的 Spring Boot 项目已经编译打包成可执行的 JAR 文件。

  2. 构建 Docker 镜像:在项目根目录下执行以下命令来构建 Docker 镜像:

docker build -t your-image-name .

其中,your-image-name 是你自定义的镜像名称。

  1. 运行 Docker 容器:运行刚刚构建的 Docker 镜像:
docker run -p 8080:8080 your-image-name

这样就可以将 Spring Boot 程序打包成使用 GraalVM 作为基础镜像的 Docker 镜像,并成功运行在 Docker 容器中了。需要注意的是,GraalVM 提供了适用于 Docker 的基础镜像,可以方便地集成到 Docker 构建流程中。

参考:https://www.cnblogs.com/fengzheng/p/16986535.html