GraalVM 介绍【架构新知系列】

GraalVM 介绍【架构新知系列】

虽然国内互联网公司基本都是万年不变的Java8,但现在Java19已经发布了。GraalVM目前有Java17和Java19版本,特别适合现在的容器化部署。下面介绍下GraalVM是什么,有哪些特性?

GraalVM是什么?

GraalVM是一个高性能的JDK,旨在加速用Java和其他JVM语言编写的应用程序的执行,同时还为JavaScript,Python,Ruby和许多其他流行语言提供运行时。 GraalVM 提供了两种运行 Java 应用程序的方法:在 HotSpot JVM 上使用 Graal 即时 (JIT) 编译器或作为提前 (AOT) 编译的本机可执行文件。 GraalVM 的多语言功能可以在单个应用程序中混合多种编程语言,同时消除外语调用成本。

本文提供 GraalVM 及其运行时模式、支持的平台、可用发行版、核心和其他功能以及各种功能的支持级别的架构概述。

GraalVM架构

GraalVM 架构

GraalVM为HotSpot Java虚拟机添加了一个 高级即时(JIT)优化编译器 ,该编译器是用Java编写的。

除了运行基于Java和JVM的语言外, GraalVM的语言实现框架(Truffle)还可以在JVM 上运行JavaScript,Ruby,Python和许多其他流行语言。 使用GraalVM Truffle,Java和其他支持的语言可以直接相互互操作,并在同一内存空间中来回传递数据。


运行时模式

GraalVM 作为运行时环境是独一无二的,提供多种操作模式:JVM 运行时模式、本机映像、松露上的 Java(可以在其中任何一个上运行相同的 Java 应用程序)。

JVM 运行时模式

在 HotSpot JVM 上运行程序时,GraalVM 默认使用 GraalVM 编译器作为顶层 JIT 编译器。 在运行时,应用程序在 JVM 上正常加载和执行。 JVM将Java或任何其他JVM原生语言的字节码传递给编译器,编译器将其编译为机器码并将其返回给JVM。 在 Truffle 框架 之上编写的支持语言的解释器本身就是在 JVM 上运行的 Java 程序。

原生镜像

Native Image是一项创新技术,可将 Java 代码编译为独立的本机可执行文件或本机共享库。 在构建本机可执行文件期间处理的 Java 字节码包括所有应用程序类、依赖项、第三方依赖库以及所需的任何 JDK 类。 生成的自包含本机可执行文件特定于不需要 JVM 的每个操作系统和机器体系结构。

Java on Truffle

Java on Truffle是Java虚拟机规范的实现,使用 Truffle语言实现框架 构建。 它是一个完整的Java VM,包含所有核心组件,实现与Java运行时环境库相同的API,并重用GraalVM中的所有JAR和本机库。


可用发行版

GraalVM 有 GraalVM Enterprise 和 GraalVM Community 版本,包括对 Java 11 和 Java 17 的支持。 GraalVM Enterprise基于Oracle JDK,而GraalVM Community基于OpenJDK。

GraalVM 适用于 x86 64 位和 AArch64 系统上的 Linux 和 macOS,以及 x86 64 位架构上的 Windows。 根据平台的不同,发行版以 .tar.gz .zip 存档的形式提供。 有关安装说明,请参阅 入门指南

GraalVM社区版

Oracle 2022年11月将 GraalVM 社区版(Java 的本机代码编译器)贡献给 OpenJDK ,但不包括 JavaScript、Python、Ruby、R 和 WebAssembly 等语言的“多语言技术”。

目前,GraalVM 社区版已经是开源的,但该公司表示,迁移到 OpenJDK 将解决包括“发布时间表、功能和开发过程差异”在内的障碍。

此举的影响之一是,GraalVM 将在适当的时候成为 JEP(Java 增强提案)流程的一部分。“当 GraalVM 技术的合适部分准备好进入主线 JDK 源代码中时,它们将伴随一个或多个 JEP。”Oracle 表示。

另外,GraalVM 版本将与 JDK(Java 开发工具包)版本保持一致,每季度进行重要补丁更新,每年发布两个功能版本,每两年发布一个长期支持版本。该调整计划在 2023 年的某个时候进行,但具体时间还未确定。

GraalVM 以将 Java 编译成较小的原生可执行文件而闻名,这些原生可执行文件的启动速度要比传统 Java 程序快得多。Oracle 在 8 月底发布了 22.2 版本,通过引入针对 Java 库的配置仓库解决了一个长期存在的痛点问题。原生 Java 编译会使用更少的内存,GraalVM 分发版在 Apple Silicon 运行得更好,并且文件体积更小。

原生编译使 Java 在云中更具竞争力。如今,Quarkus、Micronaut 和 Helidon 都支持在生产环境中使用 GraalVM。Spring 6 和 Spring Boot 3 计划在今年年底实现这一目标。


安装体验,运行js代码

 tar xzvf graalvm-ce-java19-darwin-aarch64-22.3.1.tar.gz
 sudo mv graalvm-ce-java19-22.3.1  /Library/Java/JavaVirtualMachines\n
 export PATH=/Library/Java/JavaVirtualMachines/graalvm-ce-java19-22.3.1/Contents/Home/bin:$PATH\n
 export JAVA_HOME=/Library/Java/JavaVirtualMachines/graalvm-ce-java19-22.3.1/Contents/Home\n
java -version
openjdk version "19.0.2" 2023-01-17
OpenJDK Runtime Environment GraalVM CE 22.3.1 (build 19.0.2+7-jvmci-22.3-b12)
OpenJDK 64-Bit Server VM GraalVM CE 22.3.1 (build 19.0.2+7-jvmci-22.3-b12, mixed mode, sharing)
gu install js       
Downloading: Component catalog from www.graalvm.org