Espresso

使用 GraalVM,您可以在 HotSpot 上正常執行 Java 應用程式、在 Native Image 中執行,以及在 Truffle 上執行。

Espresso,也稱為 Truffle 上的 Java,是 Java 虛擬機器規格的實作,基於 GraalVM 建構為 Truffle 直譯器。它是一個精簡的 Java VM,其中包含 VM 的所有核心元件,實作與 Java 執行環境程式庫 (libjvm.so) 相同的 API,並重複使用現有的標準程式庫。如需詳細資訊,請參閱實作細節。

Espresso 是開放原始碼,其程式碼庫可在 GitHub 上存取。

Espresso 透過 Java 位元組碼直譯器執行 Java,該直譯器使用 Truffle 架構實作,Truffle 架構是一個開放原始碼程式庫,用於編寫程式設計語言的直譯器。藉由 Espresso,Java 可以按照與 GraalVM 生態系統中的其他語言 (例如 JavaScript、Python、Ruby) 相同的原則執行,直接與這些語言互通,並在相同的記憶體空間中來回傳遞資料。除了完整的語言互通性之外,使用 Espresso 您還可以

  • 在與主機 Java VM 分開的內容中執行 Java 位元組碼。
  • 執行 Java 8、Java 11、Java 17 或 Java 21 客戶 JVM,允許您例如藉由使用 GraalVM 的 Polyglot API,將 Java 17 內容嵌入 Java 21 應用程式中。
  • 利用 Truffle 架構提供的整套工具,這些工具以前無法用於 Java。
  • 改善主機 Java VM 與在 Truffle 上執行的 Java 程式的隔離,以便您可以執行較不信任的訪客程式碼。
  • 在原生可執行檔的內容中執行,同時仍然允許動態載入的位元組碼。

Espresso 通過 Java 相容性套件 (Java SE 的 JCK 或 TCK)。

開始使用 #

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 應用程式 #

您可以在 Espresso 上執行 Java 應用程式,方法是將 -truffle 選項傳遞給標準的 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 的 JAR 檔案和原生程式庫在 GraalVM 中執行,但可以「跨版本」並指定不同的 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: 語法可確保將選項傳遞給基礎的 Native Image VM。當使用 -XX: 語法時,VM 會先檢查 Espresso 執行階段中是否有此選項。如果沒有,它會嘗試將此選項套用至基礎的 Native Image VM。這對於諸如 MaxDirectMemorySize 之類的選項可能很重要,這些選項可以在兩個層級獨立設定:-XX:MaxDirectMemorySize=256M 控制在 Espresso (訪客 VM) 上執行的 Java 程式可以保留多少原生記憶體,而 --vm.XX:MaxDirectMemorySize=256M 控制 Native Image (主機 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. 導覽至 File (檔案),然後導覽至 Project Structure (專案結構)。按一下 Project (專案),然後按一下 Project SDK (專案 SDK)。展開下拉式選單,按一下 Add JDK (新增 JDK),然後開啟您安裝 GraalVM 的目錄。對於 macOS 使用者而言,JDK 首頁路徑將為 /Library/Java/JavaVirtualMachines/{graalvm}/Contents/Home。為其命名,然後按一下 Apply (套用)。

    Intellij IDEA: Add Project Name

  2. 產生專案的來源並更新資料夾。在 Maven 側邊欄中,按一下具有旋轉器圖示的目錄

    Intellij IDEA: Generate Project Sources

  3. 啟用 Espresso。從主選單中選取 Run (執行),然後選取 Run…(執行…)。按一下 Edit Configurations (編輯組態) 並選擇 Environment (環境)。將 -truffle -XX:+IgnoreUnrecognizedVMOptions 命令置於 VM options (VM 選項) 中,然後按一下 Apply (套用)。

    Intellij IDEA: Enable Environment Configuration

必須指定 -XX:+IgnoreUnrecognizedVMOptions,因為 Intellij 會自動新增 -javaagent 引數,但目前尚不支援此引數。

  1. 按一下 Run (執行)。

偵錯 #

您不必設定任何特殊項目,即可從您最愛的 IDE 偵錯工具偵錯執行 Espresso 的 Java 應用程式。例如,從 IntelliJ IDEA 開始偵錯工具工作階段是基於執行組態。若要確保您在相同的環境中將偵錯工具附加至 Java 應用程式,請在主選單中導覽至 Run (執行) -> Debug… (偵錯…) -> Edit Configurations (編輯組態),展開 Environment (環境),檢查 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 通道直接與我們聯繫。

與我們聯繫