Eclipse OpenJ9 JVM 指南
1.概述
OpenJ9 是一個高效能、可擴充且靈活的 Java 虛擬機器。我們可以在許多 Java 應用程式中使用它來取代 HotSpot。 IBM 最初將其作為其商業 JDK 的一部分進行開發。現在這個JVM得到了Eclipse基金會的支持。
我們使用 OpenJ9 來減少記憶體佔用和啟動時間,尤其是在雲端和容器環境中。它支援 Java SE 規範並且與 OpenJDK 配合良好。 在本文中,我們將探討如何安裝 OpenJ9 JVM 並回顧其主要功能。
2.安裝
我們可以透過下載包含它的預建置 OpenJDK 二進位來安裝 OpenJ9 。許多發行版(例如 Eclipse Temurin)都提供使用 OpenJ9 的建置。官方發布列表在Eclipse OpenJ9 網站上。
下載檔案後,我們提取文件並設定JAVA_HOME
環境變數。
2.1.視窗
首先,我們將 ZIP 檔案解壓縮到首選位置,例如path-to-jdk\jdk-openj9.
然後我們設定JAVA_HOME
環境變量,並修改PATH
環境變數:
$ setx JAVA_HOME "path-to-jdk\jdk-openj9"
$ setx PATH "%JAVA_HOME%\bin;%PATH%"
最後我們驗證安裝:
$ java -version
2.2. Linux
首先,讓我們擷取檔案:
$ tar -xzf OpenJ9-JDK.tar.gz -C /opt
然後我們設定JAVA_HOME
並更新PATH
:
$ export JAVA_HOME=/opt/jdk-openj9
$ export PATH=$JAVA_HOME/bin:$PATH
我們可以將這些行新增至.bashrc
或.zshrc
以使它們永久生效。最後我們檢查安裝:
$ java -version
現在我們準備好使用 OpenJ9 來運行和開發 Java 應用程式。
3.垃圾收集政策
OpenJ9 提供了多種垃圾收集策略。每個策略針對不同的工作負載進行了最佳化。我們可以選擇適合我們績效目標的策略。
在 HotSpot JVM 中,我們透過選擇 GC 實作和調整許多參數來配置垃圾收集。在 OpenJ9 中,我們改用 GC 策略。每個策略都是針對特定用例而設計的,我們在啟動時使用虛擬機器選項選擇一個:
-Xgcpolicy:<name>
讓我們看看 OpenJ9 中可用的 GC 策略。
3.1.分代併發 GC 策略
這是預設策略,我們將在大多數應用程式中使用它。使用此 GC 策略,我們將堆分為兩個區域: nursery
和tenure
。該政策管理兩代群體: new
和older
。
它使用並發標記清除執行全域 GC,並可選擇隨後進行壓縮。部分 GC 是一種停止世界清除或併發清除。
我們使用以下標誌啟用它:
-Xgcpolicy:gencon
3.2.平衡政策
當我們面臨gencon
不可接受的暫停時間時,我們會對大型堆和許多執行緒使用此策略。該策略將堆劃分為大小相等的區域,並獲得多代支持。
全域 GC 使用增量並發標記。部分 GC 使用 Stop-the-world 和可選擇的標記、清除或壓縮。
我們可以使用標誌來新增此策略:
-Xgcpolicy:balanced
3.3.優化暫停時間策略
我們選擇這個策略來盡量減少暫停時間。例如,當我們擁有較大的堆大小並且它影響 GC 暫停的長度時,它可能會很有用。此策略使用單一、平坦的堆區域。這裡只有一代。
GC 是並發標記-清除,帶有可選的壓縮。
要開始使用此策略,我們必須新增以下標誌:
-Xgcpolicy:optavgpause
3.4.優化吞吐量策略
當我們想要在短期應用程式中獲得最大吞吐量時,我們會選擇此策略。我們這裡有一個平坦的堆區。這項政策支持一代。
GC 是一種具有可選壓縮功能的 Stop-the-World 標記-清除操作。
我們可以使用以下標誌啟用此策略:
-Xgcpolicy:optthruput
3.5.節拍器政策
我們將此策略用於即時和軟即時應用程式。它將堆劃分為按大小分類的區域。在這裡,我們得到了一代人的支持。
節拍器 GC 以短暫可中斷的突發方式運行,以避免長時間的停止世界暫停。
要使用節拍器策略,我們可以打開標誌:
-Xgcpolicy:metronome
3.6. nogc
政策
我們將此策略用於不回收記憶體的測試或特殊用例。我們這裡有一個扁平的堆。未執行 GC。
我們可以使用以下標誌啟用它:
-Xgcpolicy:nogc
4. 類別資料共享和 AOT 編譯
OpenJ9 支援開箱即用的類別資料共享和提前編譯。我們可以使用這些功能來改善啟動時間並減少記憶體使用量。
4.1.類別資料共享
類別資料共享允許我們將類元資料緩存在共享記憶體快取中。我們建立一個共享類別快取並在 JVM 運行期間重複使用它。這加快了類別載入速度並減少了記憶體佔用,尤其是在容器和微服務環境中。
為了啟用 CDS,我們使用以下標誌啟動 JVM:
-Xshareclasses
我們也可以命名快取並控制其大小:
-Xshareclasses:name=myCache,cacheDir=/path/to/cache,cacheSize=100M
要查看快取統計信息,我們使用:
-Xshareclasses:cacheStats
4.2.提前編譯
OpenJ9 中的提前編譯功能會在執行時間之前將 Java 位元組碼編譯為本機程式碼。這減少了 JIT 預熱時間並提高了啟動時的效能。
與需要 GraalVM 進行 AOT 的 HotSpot 不同,OpenJ9 具有內建支援。 VM 會自動選擇哪些方法應該基於 AOT 編譯,但我們可以使用以下標誌來停用它:
-Xnoaot
5.診斷數據和工具
OpenJ9 與 HotSpot 一樣支援 JMX。我們可以將現有的監控工具連接到它。
此外,OpenJ9 還提供了其他工具,我們可以使用這些工具來解決效能問題、崩潰或記憶體問題。我們可以使用轉儲代理來產生堆轉儲、系統轉儲和一般 JVM 資訊轉儲。
為了即時監控 CPU、記憶體、GC 和執行緒活動,我們可以利用IBM Health Center 。
6. 結論
在本教程中,我們了解了當我們想要減少記憶體使用量並加快啟動時間時,OpenJ9 是一個很好的選擇。它非常適合雲端工作負載、微服務和容器化應用程式。但是,在生產中使用 OpenJ9 之前,我們應該使用特定的工作負載對其進行測試。
同樣的建議也適用於 GC 策略選擇。每項政策針對不同的用例。我們需要測量和比較才能選擇最佳的一個。
透過正確的設置,OpenJ9 可以提供穩定的效能並節省資源。