【譯】GraalVM 快速參考
前言
GraalVM 可幫助開發(fā)者更好的使用 Java,主要包括三個方面:
通過使用最先進(jìn)的 JIT 編譯器使其更快, 將它們編譯為即時啟動和低內(nèi)存消耗的二進(jìn)制可執(zhí)行文件, 使用支持的多語言或代碼進(jìn)行編程。
這份快速參考是一頁的簡短摘要,介紹了 GraalVM 可以做什么,以及用來說明其功能的關(guān)鍵選項和命令。

GraalVM 快速參考(打印請使用高清的 pdf)
你可以下載并打印到 A4 紙上,然后將它掛在辦公室,提醒 GraalVM 可以做些什么和有哪些配置選項。一定要使用pdf版本[1]打印(高清無碼)。請注意,如果你的打印機(jī)更適應(yīng)美國字母紙格式,請使用這個版本的 PDF[2]。
在這篇文章中,我們將快速瀏覽參考中的信息,并詳細(xì)地介紹它。
一、運行 java 應(yīng)用
第一部分側(cè)重于運行 Java 應(yīng)用程序。首先,請記住,GraalVM安裝包中包含 JDK,這意味著你可以使用 GraalVM 作為 JDK。例如,使用javac編譯 Java 源代碼:
javac?MyApp.java
當(dāng)然,你也可以使用 GraalVM 來運行 Java 應(yīng)用程序或任何其他 JVM 語言。除了能夠運行 Java 之外,還得益于 GraalVM 強(qiáng)大的即時(JIT)編譯器,并獲得了最先進(jìn)的峰值性能,通常比其他 jdk 運行得更快。
java?-jar?MyApp.jar
當(dāng)使用 GraalVM 運行 Java 應(yīng)用程序時,底層 JVM 使用的是 Java Hotspot VM,這意味著大多數(shù)配置選項是相同的,例如,你可以這樣指定應(yīng)用程序類路徑:
java?-cp?target/myapp.jar?com.example.Main
GraalVM 編譯器通常在預(yù)編譯為本機(jī)共享庫模式下運行[3],但是其代碼是用 Java 編寫的,并且可以用作 JAR 文件,從而導(dǎo)致性能略有不同:使用堆內(nèi)存進(jìn)行編譯會以較長的預(yù)熱為代價(例如,編譯器的 Java 代碼需要編譯)。以下選項可配置你要運行的模式(默認(rèn)情況下啟用):
-XX:+-UseJVMCINativeLibrary
除了將編譯器作為 JAR 或 native 庫運行之外,你還可以指定優(yōu)化配置[4],economy用來加快預(yù)熱速度,并選擇enterprise以獲得最佳的峰值性能(當(dāng)然需要 GraalVM 企業(yè)版)。
-Dgraal.CompilerConfiguration=enterprise|community|economy
JIT 編譯器可能會顯著加快應(yīng)用程序,但有時不清楚編譯器是否正常工作,代碼是否真正到達(dá)頂層,以及哪些方法到達(dá)編譯器,你可以開啟編譯日志:
-Dgraal.PrintCompilation=true
除了查看日志,你還可以啟用更多的調(diào)試輸出,例如,打印編譯器圖形來分析它們,以尋找更多的優(yōu)化空間:
-Dgraal.Dump=:2
當(dāng)然,JVM 的其他特性也適用于 GraalVM。例如,你可以添加一個 Java agent,該 agent 將對代碼進(jìn)行指令插入、在運行時生成類以及其它的 Java agent 功能。基于 Java 的 agent 和 native ?agent 都可以運行。一個典型的例子是用于簡化 ?native image 構(gòu)建的輔助配置 agent。
-javaagent:path/to/jar.jar
-agentlib:path/to/native/agent
二、編譯成二進(jìn)制可執(zhí)行文件
使用 GraalVM 的第二個主要優(yōu)點是它的Native Image[5]功能:提前將應(yīng)用程序編譯成二進(jìn)制文件。使用它你需要先安裝 native-image 組件。常用方法是為 GraalVM 發(fā)行版下載組件 JAR 文件,然后運行以下命令:
gu?install?-L?native-image.jar
然后,你可以使用安裝的native-image組件來生成應(yīng)用程序的二進(jìn)制文件:
native-image?[options]?MyClass
或者,你可以使用類似于 java 命令的 JAR 文件語法:
native-image?-jar?MyApp.jar
直接運行生成的二進(jìn)制文件:
./myApp
如果你不想構(gòu)建可執(zhí)行文件[6],只是想構(gòu)建一個共享庫,那么可以使用--shared選項。你需要使用@CEntryPoint注解標(biāo)記公開的方法,但是關(guān)于這個主題的更詳細(xì)的探討超出了本文的范圍。
--shared
另一個非常有用的方法是 構(gòu)建靜態(tài)鏈接的二進(jìn)制文件[7] ,例如將 libc 這樣的操作系統(tǒng)庫鏈接到可執(zhí)行文件中。甚至可以選擇使用哪個 libc 實現(xiàn)。默認(rèn)情況下使用 glibc,muslc 是一個可選項,為此你需要配置一下構(gòu)建環(huán)境。
--static?--libc=muslc
三、多語言編程
可以運行基于Truffle-based語言的基礎(chǔ)結(jié)構(gòu):JavaScript、Ruby、Python、R 等。這將包括該語言的解釋器、Truffle 框架[8]和 JIT 編譯器,因此可以在運行時編譯代碼以加快執(zhí)行速度。
例如,其中每一項都包括對相應(yīng)語言的支持:
--language:js
--language:python
--language:llvm
--language:ruby
另一個極有吸引力的功能是 native image 可執(zhí)行文件的配置文件引導(dǎo)優(yōu)化[9]。可以生成一個已檢測的二進(jìn)制文件,對其應(yīng)用相關(guān)的工作負(fù)荷,記錄與 JIT 相似的執(zhí)行代碼的概要文件,并使用這些概要文件來構(gòu)建生產(chǎn)二進(jìn)制文件。
native-image?—?pgo-instrument?MyApp
./myApp
native-image?—?pgo?profile.iprof?MyApp
而且,如果你希望更清楚地了解本 native image 生成過程中發(fā)生的情況,例如,嘗試了解類初始化的類鏈,你可以使用一些有用的選項。
以下選項可以開啟跟蹤某個類的初始化路徑:
-H:+TraceClassInitialization=package.class.Name
native image 構(gòu)建是一個 Java 進(jìn)程,因此你可以在代碼中打一個斷點,通過代碼調(diào)試器,全面的知曉更多細(xì)節(jié)。
--debug-attach=[port]
除此之外,還有許多其他有用的選項用來配置 native image 構(gòu)建和運行時的行為,我們將在未來探討這些配置項,你也可以通過使用幫助來了解一些可用的信息:
--expert-options-all
GraalVM 給你的第三個主要優(yōu)勢是一個多語言運行時[10],能夠運行多種語言,它包括由 GraalVM 的 JavaScript 引擎的 Node.js 平臺。因此,如果你有一個 node 應(yīng)用,可以通過調(diào)用 node 命令來運行。
node?myApp.js
除此之外,還有許多語言啟動器可用于支持程序的運行:
js?myApp.js
graalpython?myApp.py
ruby?myApp.rb
R?myApp.r
lli?myApp
默認(rèn)情況下,啟動器(包括 node)將在 native 模式下運行,其中解釋器編譯為 native image 二進(jìn)制文件。因此,若要使用Java類與JVM實現(xiàn)互操作性,請使用--jvm選項,對于其他語言,請使用--polyglot:
--polyglot?--jvm
語言引擎具有許多功能來限制資源量[11],例如,語言上下文可以運行的時間(毫秒):
--sandbox.MaxCPUTime=Nms
四、通用開發(fā)工具
最后也是相當(dāng)重要的一點就是,GraalVM 語言支持通用開發(fā)工具[12]開箱即用。這是整個 GraalVM 生態(tài)系統(tǒng)中最令人興奮的部分之一:實現(xiàn)一個語言解釋器來修復(fù)語言的語義,并獲得一個強(qiáng)大的虛擬機(jī)、一組 GC 算法、一個調(diào)試器、一個分析器、一個內(nèi)存分析器和其他免費工具。
指定以下選項以分別啟用基于 Chrome DevTools 調(diào)試器、采樣探查器、跟蹤探查器和內(nèi)存分析器的調(diào)試器:
--inspect
--cpusampler
--cputracer
--memsampler
結(jié)論
GraalVM 是一個多功能的項目,提供了許多有趣的功能,你可以將這些功能用于你的應(yīng)用程序,支持 Java、JVM 語言、JavaScript、Ruby、Python、R 等。
從使用更好的即時編譯器,到構(gòu)建應(yīng)用程序的可執(zhí)行文件,再到以不同語言運行組件,現(xiàn)在你可以使用 GraalVM 了。
在這篇簡短的參考文章中,我們試圖概括GraalVM 不同功能的最常用選項。
下載 GraalVM 快速參考 PDF,打印出來,釘在墻上。讓它能不斷提醒你 GraalVM 項目是多么有趣,即使你目前只使用了一小部分功能。
在進(jìn)行此功能時,下載GraalVM?從快速參考中嘗試一些東西,比如更快地運行 Java 應(yīng)用程序,使用 native images 使微服務(wù)更加貼近云原生,或者使用其他語言的庫來增強(qiáng)我們的應(yīng)用程序!
譯者注
譯者校對:mica如夢技術(shù)、PIG冷冷、JustAuth亞東、吳天狗
原文鏈接:https://medium.com/graalvm/graalvm-quick-reference-b8d1dfe24241
譯者說
GraalVM 無疑是 ?Java 未來(5~10年)的一個大方向, 期待 Spring Boot 3 和 Spring Framework 6 對 GraalVM 的內(nèi)置支持。
連接
pdf版本:?https://www.graalvm.org/uploads/1p/graalvm-quick-reference_a4.pdf
[2]這個版本的 PDF:?https://www.graalvm.org/uploads/1p/graalvm-quick-reference_us-letter.pdf
[3]預(yù)編譯為本機(jī)共享庫模式下運行:?https://www.graalvm.org/reference-manual/compiler/#compiler-operating-modes
[4]優(yōu)化配置:?https://www.graalvm.org/reference-manual/jvm/Options/
[5]Native Image:?https://www.graalvm.org/reference-manual/native-image/
[6]可執(zhí)行文件:?https://www.graalvm.org/reference-manual/native-image/ImplementingNativeMethodsInJavaWithSVM/#create-a-shared-library
[7]構(gòu)建靜態(tài)鏈接的二進(jìn)制文件:?https://www.graalvm.org/reference-manual/native-i
[8]Truffle 框架:?https://www.graalvm.org/graalvm-as-a-platform/language-implementation-framework/
[9]配置文件引導(dǎo)優(yōu)化:?https://www.graalvm.org/reference-manual/native-image/PGO/
[10]多語言運行時:?https://www.graalvm.org/reference-manual/polyglot-programming/
[11]限制資源量:?https://docs.oracle.com/en/graalvm/enterprise/20/docs/reference-manual/embed-languages/sandbox/
[12]通用開發(fā)工具:?https://www.graalvm.org/docs/tools/
往期推薦
