GraalVM 21.0提供執行Java程式碼的第三種方式:Espresso通過Truffle框架執行Java程式碼 - graalvm
到目前為止,GraalVM提供了兩種執行Java程式的方法:將Java HotSpot VM與GraalVM JIT(即時)編譯器一起使用,以及第二種方法:使用GraalVM Native Image編譯為本機可執行檔案。
今天,我們很高興地宣佈一種在GraalVM上執行Java的新方法(第三種方法)。GraalVM 21.0引入了一個名為的新可安裝元件,espresso該元件提供了用Java編寫的JVM實現。
Espresso可以通過Truffle框架執行Java程式碼,從而將Java提升到GraalVM支援的其他語言級別。
在我們即將釋出的每個21.x版本中,預期效能(預熱和峰值效能)都會迅速提高。
現在讓我們更詳細地瞭解什麼是Truffle上的Java,探索一些可以幫助您的顯著用例,並嘗試將專案放入更大的GraalVM和Java生態系統中。
Truffle上的Java是使用Truffle語言實現框架實現的JVM。它提供了Java虛擬機器的所有核心元件:
- 位元組碼直譯器
- 位元組碼驗證器
- 單遍.class檔案解析器
- 簡單物件模型
- Java中的Java本機介面(JNI)實現
- Java虛擬機器實現
- Java除錯線協議(JDWP)
此實現的一個非常重要的細節是它是用Java實現的。Truffle上的Java是Java上的Java!自我託管是Java虛擬機器研發的聖盃。
Truffle上的Java可用於基於Java 8和Java 11的GraalVM發行版,因此從技術上講,您可以將其用作您選擇的JVM的替代品。Truffle上的Java目前仍處於試驗階段,還不是很快,所以今天不建議在生產工作負載上使用Java ,但是讓我們探索一下在Truffle上使用Java執行應用程式可以得到什麼。
Java on Java
Truffle上的Java是用Java實現的。這是一個虛擬機器實現,因此,為了實際執行Java程式碼,需要訪問類庫以及JDK提供的本機庫和方法。Truffle上的Java重用了GraalVM發行版中的JAR和本機庫。
用Java實現並能夠執行Java使得Truffle上的Java具有非常有趣的特性:它可以自行執行。的確,Truffle上的Java是一個元迴圈VM,它可以在多個層次上執行(儘管每次執行的速度越來越慢)。
成為Java程式有許多優點。其中之一是可以使用本機映像編譯為本機可執行檔案的能力
另一個優點是該程式碼是Java開發人員很好的,熟悉的並且可以理解的程式碼。考慮轉到GitHub儲存庫並檢視其原始碼。您的日常工具都可以使用它,IDE支援它,您可以像瀏覽其他Java依賴一樣探索程式碼庫。這種透明性和熟悉性應該使Truffle上的Java能夠快速有效地變得更好。
在Java8中嵌入執行Java11
Truffle上的Java是實際的JVM,它也是一個Java程式,這意味著您可以在另一個Java程式中執行它。這為將應用程式中的不同元件分隔開了非常有趣的途徑。例如,如果將Truffle上的Java指向JDK11發行版,則它可以執行Java11。訪問Java 8時,它將變為Java8。當兩個發行版都可用時,可以在Java 8的上下文中在Truffle上執行Java。應用程式並使用它來執行Java 11位元組程式碼,反之亦然。如果有一個僅適用於Java 8的庫,則可以在同一Java流程中的相容JDK 8中,通過一些程式設計工作來建立互操作性,從而遷移到較新的基本JDK並仍然執行該特定庫。
混合AOT和JIT
由於Truffle上的Java,Truffle,GraalVM編譯器以及在Truffle上有效執行Java的所有其他必要元件都是用Java編寫的,因此可以使用在Truffle上執行Java的基礎結構來構建本機映像可執行檔案。
這意味著您可以使用Java應用程式,在其中構建JVM,然後在JVM上或作為本機映像執行該應用程式。
Java on Truffle可以將JIT編譯器和動態Java執行時帶到預先編譯的二進位制檔案中。
我們準備了一個示例應用程式來說明此概念。有一個JShell實現示例,該示例採用一個普通的JShell應用程式,該應用程式由兩個獨立的部分組成:前端CLI應用程式和後端計算引擎,並用Truffle實現中的Java替換後者。
實際上,通過載入它們,可以非常巧妙地重用原始實現中的所有類。因此,示例應用程式的原始部分是“膠水”程式碼,該程式碼將主機Java部分連線到應用程式的Truffle上的Java部分。
該示例可以作為本機可執行檔案進行編譯,由於本機可執行檔案的效能特點,它可以以比正常JShell更快的速度啟動一個不錯的二進位制檔案,並且仍然可以執行我們扔給它的Java程式碼。
對於無法利用本機映像效能改進的應用程式而言,將AOT和JIT混合是一個有趣的選擇,因為它們的功能取決於動態程式碼,而動態程式碼不適用於本機映像。
高階類重新定義
Truffle上的Java比HotSpot更強大的另一個非常酷的功能是增強的熱交換功能-在除錯會話期間在執行時更改類。
從GraalVM 21.0開始,支援以下更改:
- 新增和刪除方法
- 新增和刪除建構函式
- 從介面新增和刪除方法
- 更改方法的訪問修飾符
- 更改建構函式的訪問修飾符
- Lambdas的更改
- 新增新的匿名內部類
- 刪除匿名內部類
使熱插拔更加強大的是對類欄位進行更改的能力。它正在開發中,並將在以後的版本中新增。
嘗試使用
在Truffle上嘗試Java非常簡單。它可以作為可通過gu命令安裝到基本GraalVM發行版中的元件使用。
gu install espresso gu install -L espresso-installable.jar#如果手動下載 |
安裝完成後,您可以在Truffle上的Java上執行您喜歡的應用程式,您只需傳遞-truffle給java命令即可。
java -truffle -jar myApp.jar |
在Truffle上下載Java並嘗試一下!有一些示例應用程式,其說明說明了Truffle上Java的特定功能。
相關文章
- oracle執行java程式碼OracleJava
- Java執行groovy指令碼的兩種方式Java指令碼
- Java 程式執行過程Java
- Java的六種執行緒狀態及程式碼示例Java執行緒
- appium ios java 指令碼如何用指令執行,例如 adb 那種方式執行指令碼APPiOSJava指令碼
- Java之執行緒安全問題的3種處理方式(通過執行緒同步)Java執行緒
- jexl2 執行字串Java程式碼字串Java
- Java提供的幾種執行緒池Java執行緒
- 通過 HelloWorld 瞭解 Java 程式執行過程以及執行時記憶體Java記憶體
- Java併發(三)----建立執行緒的三種方式及檢視程式執行緒Java執行緒
- 淺析Java程式的執行過程Java
- Java程式碼寫好後怎麼執行?Java
- java類內部程式碼執行順序Java
- 理解Java程式的執行Java
- 程式碼執行
- Java 執行緒池之FixedThreadPool(Java程式碼實戰-003)Java執行緒thread
- 通過原始碼理解 Java 執行緒池的核心引數原始碼Java執行緒
- 程式碼精簡執行過程
- Java7提供的並行執行任務框架:Fork、Join框架Java並行框架
- 【java】【多執行緒】建立執行緒的兩種常用方式(2)Java執行緒
- Java建立多執行緒的四種方式Java執行緒
- Java效能優化:教你提高程式碼執行的效率Java優化
- java程式碼執行字串中的邏輯運算方法Java字串
- 在GraalVM中部署執行Spring Boot應用 - Indrek OtsLVMSpring Boot
- Java執行緒(九):Condition-執行緒通訊更高效的方式Java執行緒
- Java併發程式設計之執行緒安全、執行緒通訊Java程式設計執行緒
- Java多執行緒-程式執行堆疊分析Java執行緒
- Java程式猿必會的四種執行緒池Java執行緒
- Java之自定義執行緒的2種方式Java執行緒
- Java實現多執行緒的三種方式Java執行緒
- 【.NET 6】多執行緒的幾種開啟方式和程式碼演示執行緒
- 多執行緒程式是如何執行程式碼的?執行緒行程
- Java中建構函式、靜態程式碼塊、程式碼塊的執行順序Java函式
- Java中,類與類,類中的程式碼執行順序Java
- Java™ 教程(程式和執行緒)Java執行緒
- Java程式執行系統命令Java
- Java多執行緒-執行緒通訊Java執行緒
- 一個簡單java程式的執行全過程Java