Espresso
使用 GraalVM,您可以正常运行 Java 应用程序 在 HotSpot 上,在 原生镜像 上,以及在 Truffle 上。
Espresso 也称为 Truffle 上的 Java,是基于 GraalVM 作为 Truffle 解释器构建的 Java 虚拟机规范实现,Java SE 8,Java SE 11,Java SE 17 和 Java 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 社区版的独立版本。
-
为您的操作系统下载 Espresso 24.0 独立版本
- 解压缩存档
tar -xzf <archive>.tar.gz
- 独立版本除了其原生启动器之外,还附带一个 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 应用程序。
- 克隆项目并导航到项目的目录
git clone https://github.com/spring-projects/spring-petclinic.git cd spring-petclinic
- 构建一个 JAR 文件(Spring PetClinic 使用 Maven 构建)
./mvnw package
- 然后通过选择
-truffle
运行时从命令行运行它java -truffle -jar target/spring-petclinic-<version>-SNAPSHOT.jar
- 应用程序启动后,在 localhost:8000 上访问它。
从 IDE
要从 IDE 在 Espresso 上运行 Java 项目,需要将 GraalVM 设置为项目的默认 JDK,并启用 Espresso 执行模式。例如,要使用 IntelliJ IDEA 运行 Spring PetClinic 项目,您需要
-
导航到 **文件**,然后导航到 **项目结构**。单击 **项目**,然后单击 **项目 SDK**。展开下拉菜单,按添加 **JDK** 并打开您安装 GraalVM 的目录。对于 macOS 用户,JDK 主目录路径将为
/Library/Java/JavaVirtualMachines/{graalvm}/Contents/Home
。为其命名,然后按应用。 -
为项目生成源代码并更新文件夹。在 Maven 侧边栏中,单击带有微调器图标的目录
-
启用 Espresso。从主菜单中选择 **运行**,然后选择 **运行…**。单击 **编辑配置** 并选择 **环境**。将
-truffle -XX:+IgnoreUnrecognizedVMOptions
命令放入 **VM 选项** 中,然后按应用。
必须指定 -XX:+IgnoreUnrecognizedVMOptions
,因为 IntelliJ 会自动添加一个 -javaagent
参数,该参数目前尚不支持。
- 按运行。
调试 #
您无需进行任何特殊配置即可从您喜欢的 IDE 调试器调试在 Espresso 上运行的 Java 应用程序。例如,从 IntelliJ IDEA 启动调试会话基于运行配置。要确保您将调试器附加到与运行环境相同的 Java 应用程序,请在主菜单中导航到运行 -> 调试... -> 编辑配置,展开环境,检查 JRE 值和 VM 选项值。它应该显示 GraalVM 作为项目的 JRE,VM 选项应该包括 -truffle -XX:+IgnoreUnrecognizedVMOptions
,其中 -truffle
启用 Espresso,-XX:+IgnoreUnrecognizedVMOptions
是一个临时解决方法,因为 Espresso 运行时尚不支持附加 Java 代理。
接下来阅读什么 #
Espresso 实现了与 GraalVM 生态系统中其他语言的无缝 Java 互操作性。查看 与 Truffle 语言互操作指南,了解如何加载用其他语言编写的代码、在语言之间导出和导入对象等等。
要了解实施方法、项目当前状态和已知限制,请继续访问 实现细节。
您已经可以在 Espresso 执行模式下运行一些大型应用程序,例如 Eclipse IDE、Scala 或其他语言 REPL。我们建议您查看 演示应用程序 的集合。
如果您有任何问题,请查看可用的 常见问题解答,或通过 GraalVM Slack 中的 #espresso 频道直接与我们联系。