Espresso

使用 GraalVM,您可以在 HotSpot 上、在 Native Image 中以及在 Truffle 上正常运行 Java 应用程序。

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

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

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

  • 在与宿主 Java VM 分离的上下文中运行 Java 字节码。
  • 运行 Java 8、Java 11、Java 17 或 Java 21 访客 JVM,例如,通过使用 GraalVM 的 Polyglot API,允许在 Java 21 应用程序中嵌入 Java 17 上下文。
  • 利用 Truffle 框架提供的整个工具堆栈,这些工具以前在 Java 中不可用。
  • 改进宿主 Java VM 与在 Truffle 上运行的 Java 程序之间的隔离,因此您可以运行信任度较低的访客代码。
  • 在原生可执行文件的上下文中运行,同时仍允许动态加载字节码。

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

入门 #

Espresso 可作为提供 Java 21 环境的独立发行版使用。您可以下载基于 Oracle GraalVM 或 GraalVM Community Edition 的独立版本。

  1. 下载适用于您的操作系统的 Espresso 24.2 独立版

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

在 Espresso 上运行 Java 应用程序 #

Espresso 独立版中包含的 java 启动器与标准的 java 启动器工作方式相同

执行类文件

java [options] class

执行 JAR 文件

java [options] -jar jarfile

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

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

默认情况下,Espresso 使用独立版中包含的标准库运行,但可以指定不同的 Java 安装目录(java.home)。只要新的 Java home 是受支持的版本(8、11、17 或 21),它就会自动切换版本。

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

注意:如果您使用 java 启动器的 -server 选项,则不会使用 Espresso,而是启动 HotSpot。您也可以使用 -truffle 明确要求使用 Espresso(默认)。

性能考量 #

启动时间目前还无法与常规 GraalVM 即时 (JIT) 执行所提供的速度相匹配,但开发团队在创建了完全可用的 Espresso 运行时后,现正专注于性能。您仍然可以通过向 java 传递以下选项来影响性能:

  • --engine.Mode=latency 可启用 Truffle 的延迟模式,以加快 JIT 编译速度,但会牺牲峰值性能。

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

开始运行应用程序 #

从命令行

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

# Path to Espresso installation
./path/to/bin/java -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 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. 然后从命令行运行它
    java -jar target/spring-petclinic-<version>-SNAPSHOT.jar
    
  4. 应用程序启动后,请通过 localhost:8000 访问它。

从 IDE

要在 IDE 中在 Espresso 上运行 Java 项目,您需要将 Espresso 独立版设置为项目的默认 JDK。例如,要使用 IntelliJ IDEA 运行 Spring PetClinic 项目,您需要

  1. 导航到文件,然后到项目结构。点击项目,然后点击项目 SDK。展开下拉菜单,点击添加 JDK,然后打开您安装 Espresso 独立版的目录。对于 macOS 用户,JDK 主路径将是 /Library/Java/JavaVirtualMachines/{espresso-standalone}/Contents/Home。给它一个名称,然后点击应用。

    Intellij IDEA: Add Project Name

  2. 生成源代码并更新项目文件夹。在 Maven 侧边栏中,点击带有旋转图标的目录

    Intellij IDEA: Generate Project Sources

  3. 点击运行。

调试 #

您无需配置任何特殊设置即可从您喜欢的 IDE 调试器调试运行 Espresso 的 Java 应用程序。例如,从 IntelliJ IDEA 启动调试会话是基于运行配置的。

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

要了解实现方法、项目当前状态和已知限制,请前往实现细节

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

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

联系我们