注意:
- 本教學課程位於 Oracle 提供的免費實驗室環境。
- 它會使用 Oracle Cloud Infrastructure 證明資料、租用戶及區間的範例值。完成實驗室時,請將這些值替代為您雲端環境特定的值。
使用 GraalVM Enterprise PGO 最佳化雲端原生 Java 應用系統
簡介
這個實驗室示範如何將 Java Microbenchmark Harness (JMH) 基準以原生可執行檔方式執行,並採用 GraalVM 原生映像檔建置,然後套用設定檔引導式最佳化 (PGO) 以提升效能。
GraalVM 原生影像可讓您將 Java 應用程式編譯成幾乎立即啟動的原生執行檔,所需的記憶體和 CPU 較少。
設定檔引導式最佳化 (PGO) 是 Java 生態系統中常用的技術,可降低遺漏的即時最佳化,並在一次收集執行設定檔,然後使用它們來最佳化後續編譯。使用 PGO 時,您可以收集分析資料,然後將資料饋送至 native-image 工具,這會使用此資訊進一步最佳化產生之執行檔的效能。
使用 JMH 搭配 GraalVM 原生影像的注意事項
在 JVM 上執行時,JMH 會針對每個基準建立新的 JVM,以確保每個基準的測量不會有干擾。使用 GraalVM 原生影像時無法使用此方法,因此在建置要以原生可執行檔執行的 JMH 基準時,請考量下列指導方針:
- 在每個原生可執行檔中包括單一基準
- 使用
@Fork(0)加註基準以確定基準未強制建立- 如果您想要設定檔基準以產生最佳化的基準,則顯然忽略分析時的基準結果
注意:Oracle Cloud Infrastructure (OCI) 提供 GraalVM Enterprise,無須額外付費。
實驗室目標
在此實驗室中,您將:
- 連線至 Oracle Cloud 中的遠端主機
- 在 JVM 上編譯和執行 JMH 基準
- 使用 GraalVM 原生影像將此 JMH 基準建置成原生執行檔,然後執行它
- 使用 PGO 最佳化原生可執行檔版本並加以執行
預估實驗室時間:30-45 分鐘
附註:如果您在說明中看到膝上型電腦圖示,則表示您需要輸入指令。留意一下吧。
![]()
# This is where we you will need to do something
若要複製指令,請將游標停留在欄位上,然後按一下複製到剪貼簿圖示。
若要在終端機視窗中貼上複製的指令,請在右鍵按一下,然後從內容功能表中選取 [ 貼上 ] 選項。如果您比較喜歡鍵盤快速鍵,請使用 CTRL+SHIFT+V。
STEP 1 :連線至遠端主機並檢查開發環境
您的開發環境是由遠端主機所提供:OCI 運算執行處理與 Oracle Linux 8、4 CPU 及 32GB 的記憶體。
桌面環境會在遠端主機準備就緒之前顯示,最多可能需要 2 分鐘。
Visual Studio 程式碼 (VS 代碼) 會開啟並自動連線至為您佈建的 VM 執行處理。按一下繼續 (Continue) 以接受機器指紋。

如果您沒有按一下繼續 (Continue) ,VS Code 將會顯示一個對話方塊,如下所示。按一下重試。VS Code 將要求您接受這台機器的指紋。然後按一下繼續。
連線遠端開發環境的問題
若發生任何「VS 程式碼」無法連線至以上未涵蓋的遠端開發環境的問題,請嘗試下列動作:
- 關閉 VS 代碼
- 按兩下您桌面上的「Luna-Lab.html」圖示
- 從資源頁籤複製「設定命令檔」,然後再將它貼到 Luna Desktop Terminal 中
- 重複上述指示以連線至遠端開發環境
恭喜,您現在已連線至 Oracle Cloud 的遠端主機!
指令碼將開啟連接您遠端主機的 VS 代碼,並開啟實驗室的原始碼。
接著,在 VS Code 中開啟一個終端機。您可以使用「終端機」與遠端主機互動。可透過功能表以「VS 代碼」開啟終端機:終端機 > 新終端機,如下所示。

開發環境附註
您將使用 GraalVM Enterprise 作為此實驗室的 Java 程式實際執行環境。GraalVM 是 Oracle 建立在 Oracle Java SE 上的高效能 JDK 發行版。
您的開發環境已預先設定了此實驗室所需的 GraalVM 企業版和原生映像檔工具。您可以在終端機中執行以下指令,檢查:
![]()
java -version
![]()
native-image --version
您可以繼續下一個步驟。
STEP 2: 在 JVM 上編譯和執行 JMH 基準
應用程式的原始碼 - JMH 基準 - 可在您的遠端主機上使用。JMH 基準源自電腦語言基準遊戲。它會建立二進位樹狀目錄,在收集任何樹狀目錄節點之前 - 最少使用配置數。
此 JMH 基準使用 Java 反射。native-image 工具會以稱為「封閉式世界」的假設運作,且不會在原生可執行檔中包含任何反射存取的元素,除非該工具在建置時提供了必要的組態。因此,若要建立此 JMH 基準的原生執行檔,您必須執行追蹤代理程式,將反映組態提供給 native-image。這已經為您完成以節省時間,可以在 src/main/resources/META-INF/native-image/ 中找到產生的組態。如需有關反映組態的詳細資訊,請參閱 GraalVM 原生影像與反射上的「Luna Lab」。
建置並執行基準作為 Java 應用程式,然後執行下列命令:
![]()
mvn clean package exec:exec
請注意,在 pom.xml 檔案中,您可以使用選項 -XX:-UseJVMCICompiler 明確關閉 GraalVM JIT 編譯器的指示。這表示基準將會使用 C2 JIT 編譯器執行。
應用程式會以三個反覆方式執行基準,並在終端機中顯示結果。執行需要不到四分鐘的時間才能完成。最終結果是最重要的。您應該會看到一些像:
Benchmark (binaryTreesN) Mode Cnt Score Error Units
BinaryTrees.bench 14 thrpt 3 180.819 ± 8.301 ops/s
您現在可以繼續進行下一個步驟。
STEP 3:建置 JMH 基準並執行原始執行檔
現在,使用 GraalVM Enterprise Native Image 建置原生執行檔。
JMH 基準是以 Maven 建立,並套用 GraalVM 原生映像檔建置版本的 Maven Plugin (開啟 pom.xml 以查看 native-maven-plugin Plugin 註冊)。外掛程式顯示需要將哪些 JAR 檔案傳送到 native-image,以及可執行的主要類別。
-
建立原生執行檔。組建需要大約一分鐘的時間:

mvn package -Pnative-PnativeMaven 設定檔開啟了建立原生執行檔。它會在 target 目錄中產生名為benchmark-binary-tree的原生執行檔。 -
然後將基準作為原生執行檔來執行:

./target/benchmark-binary-tree這些是使用 GraalVM Enterprise Native Image 22.2.0 取得的結果:
Benchmark (binaryTreesN) Mode Cnt Score Error Units BinaryTrees.bench 14 thrpt 3 174.135 ± 10.020 ops/s相較於先前的 (非原生) 選項,原生的可執行檔編號可能類似或更佳。其結果將根據您執行相同基準的硬體而有所不同。
您現在可以繼續進行下一個步驟。
STEP 4 :使用 PGO 最佳化原生執行檔並執行
現在使用設定檔引導式最佳化 (PGO) 將您的原生執行檔最佳化。這是兩個步驟的程序。首先,建立原生執行檔的工具版本,然後執行該版本以追蹤執行並收集效能設定檔。執行完成後,會在專案的根目錄中產生設定檔 default.iprof 。接著建立一個包含基準設定檔資料的最佳化執行檔,然後執行它。
GraalVM Enterprise Edition 提供設定檔導引式最佳化 (PGO) 功能。
-
通過
-PinstrumentedMaven 設定檔建立儀表的原生執行檔:
mvn package -Pinstrumented它會在 target 目錄中產生一個名為
benchmark-binary-tree-instr的二進位檔案。 -
執行此程式可收集程式碼執行頻率設定檔:

./target/benchmark-binary-tree-instr如果沒有另外指定,從此執行收集到的設定檔會儲存在目前工作目錄中的 default.iprof 檔案中。
注意:您可以在程式實際執行時傳送
-XX:ProfilesDumpFile=YourFileName選項,指定在執行工具原生執行檔時收集設定檔的位置。您也可以指定不同的名稱來收集多個設定檔,並在建立時將它們傳送至native-image工具。 -
現在您已產生設定檔,請建置最佳化版本:

mvn package -Poptimized它會在
target目錄中產生最佳化的二進位檔,稱為benchmark-binary-tree-opt。 -
最後,執行最佳化原生執行檔:

./target/benchmark-binary-tree-opt
這些是在主機機器上使用 GraalVM Enterprise Native Image 22.2.0 取得的結果:
Benchmark (binaryTreesN) Mode Cnt Score Error Units
BinaryTrees.bench 14 thrpt 3 223.241 ± 3.578 ops/s
每秒平均作業分數從以 Java 應用程式形式執行的 180 增加到以最佳化原生執行檔形式執行的 223。其結果將根據您執行相同基準的硬體而有所不同。
摘要
此實驗室顯示如何使用「設定檔引導式最佳化 (PGO)」將原生執行檔最佳化,以取得與 Java 版本比較的更高傳輸量,同時仍保留其他優點:即時啟動、較低的 CPU 和記憶體使用量。有了 PGO,您便可以針對特定工作負載「訓練」您的應用系統,然後將其轉換成最佳化的二進位檔,而無須影響任何效能。
深入瞭解
恭喜!您已成功完成此實驗室。
其他學習資源
探索 docs.oracle.com/learn 的其他實驗室,或者存取更多 Oracle Learning YouTube 頻道上的免費學習內容。此外,請瀏覽 education.oracle.com/learning-explorer 以成為 Oracle Learning 檔案總管。
如需產品文件,請造訪 Oracle Help Center 。
Optimize Cloud Native Java Applications with GraalVM Enterprise PGO
F75977-01
January 2023
Copyright © 2023, Oracle and/or its affiliates.
