在我們開始討論策略之前,讓我們先了解啟動時間和記憶體佔用在 Java 應用程式的上下文中意味著什麼。
啟動時間是指Java應用程式啟動後到準備好處理請求所需的時間。對於快速部署和可用性至關重要的應用程式來說,最大限度地縮短啟動時間至關重要。
Java 應用程式的記憶體佔用量是其執行時間消耗的記憶體量。較大的記憶體佔用可能會導致更高的成本和增加的延遲,尤其是在雲端環境中。
在這裡,我們將探索各種方法來減少 Java 應用程式的啟動時間。
類別資料共享(CDS)是一種允許 JVM 在多個 Java 進程之間共享公共類別元資料的技術,從而減少載入類別所需的時間。
範例:
java -Xshare:dump -XX:+UseAppCDS -XX:SharedClassListFile=classlist -XX:SharedArchiveFile=app-cds.jsa -cp myapp.jar
此命令產生一個共享存檔,可用於透過使用預先載入的類別更快地啟動應用程式。
啟用 CDS 可以減少約 15% 的啟動時間,具體取決於應用程式的複雜性。
GraalVM 可讓您將 Java 程式碼編譯為本機二進位文件,透過避免 JVM 預熱來顯著減少啟動時間。
GraalVM 是一種先進的多語言虛擬機,不僅支援多種語言,還提供用於最佳化 Java 應用程式的強大功能。 GraalVM 的突出功能之一是將 Java 應用程式編譯為本機二進位檔案的能力。此過程稱為提前 (AOT) 編譯,它帶來了顯著的效能優勢,特別是在減少啟動時間方面。
當您使用 GraalVM 的 Native Image 工具編譯 Java 應用程式時,整個應用程式及其相依性和 JVM 的必要部分將被編譯為單一本機執行檔。這個可執行檔可以直接在作業系統上執行,無需 Java 虛擬機器 (JVM) 來解釋字節碼。
範例:
java -Xshare:dump -XX:+UseAppCDS -XX:SharedClassListFile=classlist -XX:SharedArchiveFile=app-cds.jsa -cp myapp.jar
此命令將您的應用程式轉換為本機可執行文件,從而幾乎瞬時啟動。
使用 GraalVM Native Image 可以減少高達 90% 的啟動時間,儘管這需要徹底的測試,因為它可能不支援所有 Java 功能。
AOT 編譯涉及在應用程式運行之前將 Java 位元組碼提前翻譯為本機機器碼。此過程會產生一個可執行二進位文件,其中包括已編譯的機器碼和任何必要的執行時間元件。目標是消除或最小化應用程式啟動和執行期間對 JIT 編譯的需求。
在 AOT 編譯過程中,Java 編譯器或 GraalVM 的 Native Image 等專用工具會從 Java 原始碼生成本機執行檔。然後,使用該本機程式碼直接執行應用程序,無需 JVM 即時執行 JIT 編譯。
範例:
native-image -jar myapp.jar
此指令預編譯特定方法,減少 JIT 編譯的時間。
AOT 可以減少約 10% 的啟動時間,特別是對於具有複雜初始化序列的應用程式。
減少類路徑中的類別和庫的數量也有助於縮短啟動時間。
範例 :使用 jlink 等工具建立自訂 JRE:
java -XX:+UnlockExperimentalVMOptions -XX:AOTLibrary=./myapp.so -cp myapp.jar
這個自訂 JRE 僅包含您的應用程式所需的模組,從而減少了開銷。
此最佳化可以透過消除載入不必要的類別來減少 5-10% 的啟動時間。
減少記憶體佔用對於擴展應用程式至關重要,尤其是在資源根據使用情況計費的雲端環境中。
G1 垃圾收集器旨在最大限度地減少暫停時間,並可以透過壓縮活動物件來減少記憶體使用量。
範例
jlink --module-path $JAVA_HOME/jmods --add-modules java.base,java.sql --output custom-jre
此指令將 JVM 配置為使用具有最佳化堆設定的 G1 GC。
G1 GC 在具有大量即時資料的應用程式中可以減少高達 30% 的記憶體佔用。
調整 JVM 記憶體設定(例如堆疊大小、堆疊大小和元空間)可以顯著減少記憶體佔用。
範例:
java -Xshare:dump -XX:+UseAppCDS -XX:SharedClassListFile=classlist -XX:SharedArchiveFile=app-cds.jsa -cp myapp.jar
此指令微調堆和元空間設定以減少記憶體消耗。
仔細的記憶體調整可以使記憶體使用量減少 20-30%。
JVM 可以偵測重複的字串並在記憶體中僅儲存一份副本,從而在應用程式使用許多相同的字串時節省空間。
範例:
native-image -jar myapp.jar
此指令啟用字串去重,在存在許多重複字串時減少記憶體使用。
字串去重可以減少高達 10% 的記憶體使用量,特別是在文字較多的應用程式中。
過多的物件建立會增加記憶體使用量。使用物件池或不可變物件來最大限度地減少不必要的分配。
範例:
java -XX:+UnlockExperimentalVMOptions -XX:AOTLibrary=./myapp.so -cp myapp.jar
這種單例模式減少了應用程式生命週期中建立的物件數量。
減少物件建立可以減少 10-20% 的記憶體使用量,具體取決於應用程式的結構。
優化 Java 應用程式的啟動時間和記憶體佔用可以顯著提高效能並節省成本。透過實施所討論的策略(例如啟用 CDS、使用 GraalVM、AOT 編譯和記憶體調整),您可以實現所需的啟動時間減少 60% 和記憶體使用量減少 50%。這些優化在雲端平台等資源受限的環境中特別有效。
請記住,每個應用程式都是獨一無二的,因此必須在您的特定環境中測試這些策略,以確保它們提供預期結果。
如果您對這些技術有任何疑問或需要進一步說明,請隨時在下面發表評論!
閱讀更多文章:將 Java 應用程式的啟動時間和記憶體佔用減少多達 60% 的策略
以上是將 Java 應用程式的啟動時間和記憶體佔用量減少最多的策略的詳細內容。更多資訊請關注PHP中文網其他相關文章!