- 適用於 JDK 23 的 GraalVM (最新版)
- 適用於 JDK 24 的 GraalVM (搶先體驗版)
- 適用於 JDK 21 的 GraalVM
- 適用於 JDK 17 的 GraalVM
- 封存
- 開發組建
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 社群版的獨立版本。
-
下載適用於您的作業系統的 Espresso 24.0 獨立版本
- 解壓縮封存檔
tar -xzf <archive>.tar.gz
- 獨立版本除了原生啟動器外,還包含 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 應用程式。
- 複製專案並導覽至專案的目錄
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 專案,您需要
-
導覽至 File (檔案),然後導覽至 Project Structure (專案結構)。按一下 Project (專案),然後按一下 Project SDK (專案 SDK)。展開下拉式選單,按一下 Add JDK (新增 JDK),然後開啟您安裝 GraalVM 的目錄。對於 macOS 使用者而言,JDK 首頁路徑將為
/Library/Java/JavaVirtualMachines/{graalvm}/Contents/Home
。為其命名,然後按一下 Apply (套用)。 -
產生專案的來源並更新資料夾。在 Maven 側邊欄中,按一下具有旋轉器圖示的目錄
-
啟用 Espresso。從主選單中選取 Run (執行),然後選取 Run…(執行…)。按一下 Edit Configurations (編輯組態) 並選擇 Environment (環境)。將
-truffle -XX:+IgnoreUnrecognizedVMOptions
命令置於 VM options (VM 選項) 中,然後按一下 Apply (套用)。
必須指定 -XX:+IgnoreUnrecognizedVMOptions
,因為 Intellij 會自動新增 -javaagent
引數,但目前尚不支援此引數。
- 按一下 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 代理程式。
接下來要閱讀的內容 #
Espresso 能夠與 GraalVM 生態系統中的其他語言無縫地進行 Java 互通性。查看與 Truffle 語言的互通性指南,以了解如何載入以其他語言撰寫的程式碼、在語言之間匯出和匯入物件等等。
若要了解實作方法、專案的目前狀態以及已知的限制,請繼續前往實作細節。
您已經可以 Espresso 執行模式執行一些大型應用程式,例如 Eclipse IDE、Scala 或其他語言 REPL。我們建議您查看示範應用程式的集合。
如果您有任何疑問,請查看可用的常見問題,或透過 GraalVM Slack 中的 #espresso 通道直接與我們聯繫。