GraalVM快速參考指南 - graalvm

banq發表於2021-01-08

GraalVM是一個通用專案,提供許多有趣的功能,您可以將它們用於您的應用程式,包括Java,JVM語言,JavaScript,Ruby,Python,R等。
從使用更好的即時編譯器,到構建應用程式的本機可執行檔案,再到以不同語言執行元件,您現在都可以使用GraalVM。
在此快速參考中,我們嘗試概述最常用的選項,這些選項描述了GraalVM的不同功能。
GraalVM可以透過三種主要方法來幫助Java應用程式:透過使用最新的JIT編譯器來使其更快,透過即時啟動和低記憶體消耗將它們編譯為獨立的本機可執行檔案,以及可執行其他語言的程式碼或庫。
 
第一部分著重於執行Java應用程式。最重要的是,要記住GraalVM發行版包含一個包含所有常用JDK工具的JDK,這意味著您可以將GraalVM用作您的JDK。例如,使用javac實用程式編譯Java原始碼:

javac MyApp.java
 

當然,您也可以使用GraalVM執行Java應用程式或任何其他JVM語言。除了能夠執行Java之外,GraalVM還受益於其強大的實時(JIT)編譯器並達到了最新的峰值效能,通常比其他JDK更快地執行它們。

java -jar MyApp.jar

 
使用GraalVM實時執行Java應用程式時,底層JVM是通常的Java Hotspot(tm)VM,這意味著大多數配置選項是等效的,例如,指定應用程式的類路徑的工作方式如下:

java -cp target/myapp.jar com.example.Main
 

GraalVM編譯器通常在預編譯為本機共享庫模式下執行。但是其程式碼是用Java編寫的,並且可以用作JAR檔案,從而導致效能略有不同:使用堆記憶體進行編譯會以較長的預熱為代價(例如,編譯器的Java程式碼需要編譯)。以下選項配置要在哪種模式下執行(+預設情況下啟用):

-XX:+-UseJVMCINativeLibrary

 
除了將編譯器作為JAR或本機庫執行之外,您還可以指定用於最佳化的配置,用economy實現更快的預熱和enterprise最佳的峰值效能(當然需要GraalVM Enterprise)。

-Dgraal.CompilerConfiguration=enterprise|community|economy


 
JIT編譯器的影響可以極大地加速應用程式的執行,但是有時尚不清楚編譯器是否正常工作,程式碼是否真正到達頂層以及哪些方法可以到達編譯器。

-Dgraal.PrintCompilation=true

 
除了檢視日誌外,還可以啟用更多除錯輸出,例如,列印編譯器圖以對其進行分析,以尋找更多的最佳化機會:

-Dgraal.Dump=:2

 
當然,JVM的其他功能也可以與GraalVM一起使用。例如,您可以附加一個Java代理,它將檢測程式碼,在執行時生成類以及其他Java“代理”內容。基於Java的代理和本機代理都可以工作。一個值得注意的例子是用於簡化本機映象或映像構建的輔助配置代理。

-javaagent:path/to/jar.jar
-agentlib:path/to/native/agent

 
使用GraalVM的第二個主要優點是其本機映像功能:提前將應用程式編譯成本機二進位制檔案。為了使用它,您需要安裝native-image元件。一種方法是為GraalVM發行版下載元件的JAR檔案,然後執行以下命令:

gu install -L native-image.jar

 
然後,您可以使用已安裝的native-image實用程式準備應用程式的本機二進位制檔案:

native-image [options] MyClass

或者,您可以使用類似於該java命令的JAR檔案語法。

native-image -jar MyApp.jar

像任何可執行檔案一樣執行生成的二進位制檔案:

./myApp

 
如果您想構建一個共享庫而不是可執行檔案,則可以透過傳遞該--shared選項來實現。您需要用@CEntryPoint註釋標記要公開的方法,但是對該主題的更詳細探索不在本文討論範圍之內。

--shared

 
另一個非常有用的可能性是構建靜態連結的二進位制檔案,其中將類似的OS庫libc連結到可執行檔案中。甚至有可能選擇libc要使用的實現。glibc預設情況下使用,muslc是一個選項,您需要為此稍微準備構建環境。

--static --libc=muslc

 
可執行基於Truffle的語言的基礎結構:JavaScript,Ruby,Python,R等。這將包括該語言的直譯器,Truffle框架和JIT編譯器,因此可以在執行時編譯程式碼以加快執行速度。
例如,每一個都將包括對相應語言的支援:
例如,每一個都將包括對相應語言的支援:

--language:js 
--language:python 
--language:llvm 
--language:ruby

 
另一個引人入勝的功能是針對本機映像可執行檔案的配置檔案引導的最佳化。您可以生成一個已檢測的二進位制檔案,對其應用相關的工作負荷,記錄與JIT相似的執行程式碼的概要檔案,並使用這些概要檔案來構建生產二進位制檔案。

native-image — pgo-instrument MyApp
./myApp
native-image — pgo profile.iprof MyApp

 
如果您想更清楚地瞭解本機映像構建過程中發生的情況,例如,嘗試瞭解初始化類所依據的類鏈,則可以使用一些有用的選項。
透過以下方法可以將初始化路徑跟蹤到某個類:

-H:+TraceClassInitialization=package.class.Name
 

本機映像構建是一個Java流程,因此您可以在程式碼中放置一個斷點並將偵錯程式附加到該斷點上,以全面瞭解正在發生的事情。

--debug-attach=[port]

 
除此之外,還有很多其他有用的選項可用於配置本機映像構建和執行時行為,我們將在以後進行探討,但是您可以使用專家幫助選項來了解可用的內容:

--expert-options-all

 
GraalVM給您的第三個主要優點是多語言執行時,能夠執行多種語言,並且包括由GraalVM的JavaScript引擎提供支援的Node.js平臺。因此,如果您有Node應用程式,則可以透過呼叫node命令來執行。

node myApp.js

 
最重要的是,您可以使用多種語言啟動器來以受支援的語言執行程式:

js myApp.js 
graalpython myApp.py 
ruby myApp.rb 
R myApp.r 
lli myApp

 
像node這樣的啟動程式預設情況下在純模式下執行,在該模式下,直譯器被編譯為本地影像二進位制檔案。因此,要啟用與JVM的互操作性以使用Java類,請使用--jvmoption和for其他語言--polyglot:

--polyglot --jvm

語言引擎具有許多功能來限制資源量,例如語言上下文可以執行的時間(以毫秒為單位):

--sandbox.MaxCPUTime=Nms

 
最後但並非最不重要的一點是,GraalVM語言支援開箱即用的通用開發人員工具。這是整個GraalVM生態系統中最激動人心的部分之一-實施語言直譯器,以修復語言的語義,並獲得功能強大的虛擬機器,精選的GC演算法,偵錯程式,分析器,記憶體分析器和其他工具。
指定以下選項以分別啟用基於Chrome DevTools偵錯程式的偵錯程式,取樣分析器,跟蹤分析器和記憶體分析器:

--inspect
--cpusampler
--cputracer
--memsampler


 
 下載本指南圖


 

相關文章