Espresso

使用 GraalVM,您可以正常运行 Java 应用程序 在 HotSpot 上,在 原生镜像 上,以及在 Truffle 上。

Espresso 也称为 Truffle 上的 Java,是基于 GraalVM 作为 Truffle 解释器构建的 Java 虚拟机规范实现,Java SE 8Java SE 11Java SE 17Java SE 21。它是一个微型的 Java 虚拟机,包含所有核心 VM 组件,实现与 Java 运行时环境库(libjvm.so)相同的 API,并重用现有标准库。有关更多信息,请参见 实现细节

Espresso 是开源的,其代码库可在 GitHub 上访问

Espresso 通过使用 Truffle 框架 实现的 Java 字节码解释器来运行 Java,Truffle 框架是一个用于编写编程语言解释器的开源库。使用 Espresso,Java 可以按照与 GraalVM 生态系统中的其他语言(如 JavaScript、Python、Ruby)相同的原理执行,直接与这些语言互操作,并在同一内存空间中来回传递数据。除了完整的语言互操作性之外,使用 Espresso 您还可以

  • 在与主机 Java 虚拟机不同的上下文中运行 Java 字节码。
  • 运行 Java 8、Java 11、Java 17 或 Java 21 客机 JVM,例如,通过使用 GraalVM 的多语言 API,可以在 Java 21 应用程序中嵌入 Java 17 上下文。
  • 利用 Truffle 框架提供的整套工具,这些工具以前无法用于 Java。
  • 提高主机 Java 虚拟机和在 Truffle 上运行的 Java 程序的隔离性,因此您可以运行信任度较低的客机代码。
  • 在原生可执行文件的上下文中运行,同时仍然允许动态加载的字节码。

Espresso 通过了 Java 兼容性工具包(JCK 或 TCK,用于 Java SE)。

入门 #

Espresso 可作为独立发行版提供,该发行版提供 Java 21 环境。您可以下载基于 Oracle GraalVM 或 GraalVM 社区版的独立版本。

  1. 为您的操作系统下载 Espresso 24.0 独立版本

  2. 解压缩存档
     tar -xzf <archive>.tar.gz
    
  3. 独立版本除了其原生启动器之外,还附带一个 JVM。检查版本以查看运行时是否处于活动状态
     # Path to Espresso installation
     ./path/to/bin/java -truffle -version
    

在 Espresso 上运行 Java 应用程序 #

您可以通过将 -truffle 选项传递给标准 java 启动器,在 Espresso 上运行 Java 应用程序。这类似于以前在 -client-server JVM 之间切换的方式。

要执行类文件

java -truffle [options] class

要执行 JAR 文件

java -truffle [options] -jar jarfile

您还可以从模块中的主类运行 Java 应用程序,或运行单个源文件程序

java -truffle [options] -m module[/<mainclass>]
java -truffle [options] sourcefile

默认情况下,Espresso 在 GraalVM 内运行,通过重用所有 GraalVM 的 JAR 文件和原生库来运行,但可以“跨版本”,并指定不同的 Java 安装目录(java.home)。它将自动切换版本,无论主机 JVM 是什么。

java -truffle --java.JavaHome=/path/to/java/home -version

性能注意事项 #

启动时间尚未达到常规 GraalVM 即时 (JIT) 执行提供的速度,但已创建了完全可用的 Espresso 运行时,开发团队现在正在专注于性能。您仍然可以通过将以下选项传递给 java -truffle 来影响性能

  • --engine.MultiTier=true 以启用多层编译;
  • --engine.Inlining=false--java.InlineFieldAccessors=true 相结合,以使编译速度更快,但性能较慢。

--vm.XX: 语法确保将选项传递给底层的 原生镜像 VM。使用 -XX: 语法时,VM 首先检查 Espresso 运行时中是否具有此类选项。如果没有,它将尝试将此选项应用于底层的原生镜像 VM。对于诸如 MaxDirectMemorySize 之类的选项,这可能很重要,这些选项可以在两个级别上独立设置:-XX:MaxDirectMemorySize=256M 控制在 Espresso(客机 VM)上运行的 Java 程序可以预留多少原生内存,而 --vm.XX:MaxDirectMemorySize=256M 控制原生镜像(主机 VM)可以预留多少原生内存。

开始运行应用程序 #

从命令行

要确保您已成功安装 Espresso,请验证其版本

# Path to Espresso installation
./path/to/bin/java -truffle -version

HelloWorld.java 示例为例,编译它并从命令行运行

public class HelloWorld {
  public static void main(String[] args) {
    System.out.println("Hello, World!");
  }
}
$JAVA_HOME/bin/javac HelloWorld.java
$JAVA_HOME/bin/java -truffle HelloWorld

以一些实际应用程序为例,尝试运行 Spring PetClinic - 一个演示 Spring Boot 与 Spring MVC 和 Spring Data JPA 使用的示例 Web 应用程序。

  1. 克隆项目并导航到项目的目录
    git clone https://github.com/spring-projects/spring-petclinic.git
    cd spring-petclinic
    
  2. 构建一个 JAR 文件(Spring PetClinic 使用 Maven 构建)
    ./mvnw package
    
  3. 然后通过选择 -truffle 运行时从命令行运行它
    java -truffle -jar target/spring-petclinic-<version>-SNAPSHOT.jar
    
  4. 应用程序启动后,在 localhost:8000 上访问它。

从 IDE

要从 IDE 在 Espresso 上运行 Java 项目,需要将 GraalVM 设置为项目的默认 JDK,并启用 Espresso 执行模式。例如,要使用 IntelliJ IDEA 运行 Spring PetClinic 项目,您需要

  1. 导航到 **文件**,然后导航到 **项目结构**。单击 **项目**,然后单击 **项目 SDK**。展开下拉菜单,按添加 **JDK** 并打开您安装 GraalVM 的目录。对于 macOS 用户,JDK 主目录路径将为 /Library/Java/JavaVirtualMachines/{graalvm}/Contents/Home。为其命名,然后按应用。

    Intellij IDEA: Add Project Name

  2. 为项目生成源代码并更新文件夹。在 Maven 侧边栏中,单击带有微调器图标的目录

    Intellij IDEA: Generate Project Sources

  3. 启用 Espresso。从主菜单中选择 **运行**,然后选择 **运行…**。单击 **编辑配置** 并选择 **环境**。将 -truffle -XX:+IgnoreUnrecognizedVMOptions 命令放入 **VM 选项** 中,然后按应用。

    Intellij IDEA: Enable Environment Configuration

必须指定 -XX:+IgnoreUnrecognizedVMOptions,因为 IntelliJ 会自动添加一个 -javaagent 参数,该参数目前尚不支持。

  1. 按运行。

调试 #

您无需进行任何特殊配置即可从您喜欢的 IDE 调试器调试在 Espresso 上运行的 Java 应用程序。例如,从 IntelliJ IDEA 启动调试会话基于运行配置。要确保您将调试器附加到与运行环境相同的 Java 应用程序,请在主菜单中导航到运行 -> 调试... -> 编辑配置,展开环境,检查 JRE 值和 VM 选项值。它应该显示 GraalVM 作为项目的 JRE,VM 选项应该包括 -truffle -XX:+IgnoreUnrecognizedVMOptions,其中 -truffle 启用 Espresso,-XX:+IgnoreUnrecognizedVMOptions 是一个临时解决方法,因为 Espresso 运行时尚不支持附加 Java 代理。

Intellij IDEA: Debug Configuration

Espresso 实现了与 GraalVM 生态系统中其他语言的无缝 Java 互操作性。查看 与 Truffle 语言互操作指南,了解如何加载用其他语言编写的代码、在语言之间导出和导入对象等等。

要了解实施方法、项目当前状态和已知限制,请继续访问 实现细节

您已经可以在 Espresso 执行模式下运行一些大型应用程序,例如 Eclipse IDE、Scala 或其他语言 REPL。我们建议您查看 演示应用程序 的集合。

如果您有任何问题,请查看可用的 常见问题解答,或通过 GraalVM Slack 中的 #espresso 频道直接与我们联系。

与我们联系