緩慢的Java啟動問題在Java社區中是臭名昭著的。啟動和預熱緩慢的影響是由我們使用的復雜框架和運行時的動態特性造成的。
從技術上講,Java應用程序啟動和預熱包括幾個連續的過程:JVM啟動、應用程序啟動和JVM預熱。在這些過程中,JVM獲得了額外的時間來提供應用程序的最高性能。
JVM利用預熱階段來編譯和優化代碼。代碼解釋和優化需要這個過程,在大型復雜應用程序的情況下,這個過程比啟動過程持續的時間長得多,最多需要幾分鐘。
每次啟動程序時,這些過程都是從頭開始的。實際上,這意味著我們要花時間運行應用程序,并使用大量的CPU和內存資源來確保它在啟動點的性能。因此,緩慢的啟動和預熱會導致在準備應用程序運行的階段花費額外的資源,而不是其操作可能需要的資源。
因此,由于啟動和預熱緩慢,你會增加云成本和資源利用率。
有幾種方法可以解決這個問題。
Native Image:能夠減少Java應用程序的啟動時間。它使用一種不同的AOT編譯器,這種編譯器通常能提供更好的性能。Native Image使用“封閉世界假設”方法,根據定義,它的編譯器刪除了預熱階段。Native Image包含代碼和數據,它們是通過運行用戶定義的靜態初始化程序創建的預初始化堆。本Native Image快照機制只記錄核心庫類和用戶定義的靜態初始化代碼。這種方法的特別優勢是允許本機映像保持相同的部署大小。在規劃Native Image實現時,應參考本機映像兼容性指南,以確保它適用于你的特定應用程序,因為并非所有Java應用程序都可以利用這種方法。
Project Leyden:它的主要目標是“改善Java程序的啟動時間、達到性能峰值的時間和占用空間。”這個項目仍然需要完成,我們還無法評估適應的效果和可能的困難。然而,在所有項目中,Project Leyden旨在解決啟動緩慢的問題,我們對結果抱有很大的期望。
在檢查點進行協調恢復(CRaC):是一個完全專注于Java啟動增強的OpenJDK項目。該項目的主要目標是開發一個新的標準機制無關的API來通知Java程序有關檢查點和恢復事件的信息。檢查點協調恢復(CRaC)提供檢查點/恢復API機制解決方案,允許在任意時間點創建正在運行的應用程序的映像(“檢查點”),然后從檢查點文件啟動映像(快照)。CRaC快照(“檢查點”)包括熱點進程在特定時間點的整個狀態。然后,應用程序的狀態恢復到創建檢查點的位置,并繼續執行。此外,將CRaC特性與Java runtime結合使用還提供了分發大量快照副本的選項,這對于在多個實例上部署尤其重要。不過,使用CRaC來減少應用程序需要對CI/CD環境進行一些修改,并且最佳選擇檢查點時間可能并不容易。
Amazon Lambda:基于CRaC技術的獨立產品。Lambda在高可用性計算基礎架構上運行你的代碼,并執行所有計算資源管理,包括服務器和操作系統維護、容量供應、自動擴展和日志記錄。Lambdas對于你的開發目標來說非常方便,但與JVM相比,它們也更昂貴且效率更低。
Java優化:遷移到較新的Java長期發布(LTS)版本可以稍微提高應用程序的性能,帶來一些微小的變化。這種優化是一種快速的方法,可以立即使用。
當今Java生態系統的廣闊性,以及Java社區提供的處理復雜工作負載中Java啟動的單一問題的各種方法。選擇現成的工具取決于你的應用程序需求,但是肯定有不止一種方法可以讓你的Java既具有云原生特性又具有可持續性。有了能夠為你的開發例程提供所有深度產品的合適的供應商,你的Java之旅就永遠是完整的。