在前面的章節中,我們介紹了GraalVM的核心概念,但遺漏了關於Java虛擬機(JVM)架構實作的部分。因此,今天特別補充這個章節,來更好地幫助讀者理解JVM的運行方式。
我們已經介紹了Java虛擬機(JVM)的概念框架。在實際的開發和運行中,JVM的具體實作會根據不同的實施方式而有所差異。目前,最廣泛使用的JVM實作之一是 Oracle 的 HotSpot JVM。它是自1999年以來Oracle和前身Sun Microsystems的主要JVM實作,針對執行性能進行了多年的優化。
HotSpot JVM有兩個主要的執行模式:解釋執行(Interpretation)和即時編譯(Just-In-Time Compilation, JIT)。在解釋執行模式下,字節碼逐行被解釋執行,這種方式相對較慢。當程式碼運行多次時,JIT編譯器將會動態地將字節碼編譯為本地機器碼,大大提高了性能。此外,HotSpot還引入了記憶體管理和垃圾回收的優化策略,如G1、Parallel GC和ZGC等,使其在處理大型應用時具備良好的性能表現。
不同於HotSpot的還有其他JVM實作,如OpenJ9、Zulu等。更多JVM實作的完整清單可以參考Java 虛擬機清單。
HotSpot JVM 是 Java 虛擬機家族中最受歡迎的版本之一,由 Oracle 公司開發,並作為標準的 JVM 隨 Java Development Kit(JDK)一同分發。它的廣泛使用源於性能、可擴展性和兼容性各方面的優勢。
HotSpot JVM 的架構如下圖
架構整體上大致與上一章節介紹的框架概念圖相同,但在實作上,我們通常會聚焦於 Execution Engine(執行引擎) 的部分。其中一個非常重要的組件是 JIT Compiler(即時編譯器)。JIT 編譯器的作用是當程式運行時,將需要執行的 Java 字節碼動態編譯成機器碼,從而讓處理器能夠直接讀取並執行這些編譯後的機器碼。
.class
文件(編譯後的 Java 類)加載到 JVM 的記憶體中,以便執行。C1(Client Compiler)
和 C2(Server Compiler)
兩種 JIT 編譯器。C1 編譯器針對快速啟動和低延遲進行優化,而 C2 編譯器則針對長時間運行的程式碼進行深度優化,適合伺服器應用。JIT 編譯器的特點是能夠在程式運行時,動態判斷哪些程式碼被頻繁執行,並針對這些「熱點」程式碼進行編譯和優化。這與 GraalVM 所採用的 AOT(Ahead-of-Time 編譯)技術不同,後者是在應用程式運行之前,將所有程式碼預先編譯成機器碼。關於這部分的詳細內容,請看前述章節GraalVM介紹。
HotSpot 的名稱源於其「熱點」檢測和優化技術。JVM 在運行時會監控程式,找出那些被頻繁執行的程式碼(即熱點程式碼)
JIT 編譯器由兩個主要部分組成,分別是 C1 (Client Compiler) 和 C2 (Server Compiler),它們針對不同的應用場景進行編譯和優化。其架構圖如下
C1 編譯器是一個 初級編譯器,在應用程式剛啟動、程式碼首次被執行時,C1 會迅速地將字節碼編譯成機器碼,以便應用能夠立即運行。C1 的主要目的是提供 快速啟動 和 低延遲,使應用能夠迅速響應用戶的請求。
C1 的設計是為了在啟動階段提供快速的編譯體驗,這樣應用程式能夠快速運行,且程式碼可以在短時間內被多次執行。隨著程式運行時間增長,JVM 會將重點轉向 C2 編譯器來進行深度優化。
C2 編譯器是 高級編譯器,主要負責對**「熱點」**程式碼進行深入的優化。當 JVM 檢測到某段程式碼被頻繁運行(即識別為熱點程式碼)後,會將這段程式碼交給 C2 編譯器,C2 編譯器會針對這些「熱點」進行更深層次的編譯和優化,生成運行速度更快、性能更高的機器碼。
由於 C2 編譯器會對「熱點」進行大量的優化,因此它適合用於那些需要持續運行的伺服器端應用程式,這類應用的關鍵程式碼片段可能會被執行數百萬次。透過 C2 的深入優化,能夠顯著減少 CPU 的佔用時間,從而提高整體性能。
Step1 : 啟動階段:當應用啟動時,JVM 首先會使用解釋器逐行解釋字節碼執行,並且啟用 C1 編譯器 來快速編譯那些最初被執行的程式碼,保證程式快速啟動並能夠迅速運行。
Step2 : 熱點檢測:隨著應用的運行,JVM 會檢測哪些程式碼被頻繁執行。這些頻繁執行的程式碼會被標記為「熱點」。
Step3 : 深入優化:一旦某些程式碼被標記為熱點,JVM 會將它們交給 C2 編譯器 進行更高級的優化。C2 編譯器會生成高度優化的機器碼,使得這些程式碼在後續執行中達到最高的運行效率。
總結來說,HotSpot JVM 透過「熱點」檢測和即時編譯(JIT)技術,在提供高效執行性能的同時,保證了 Java 應用的穩定性和擴展性。然而,隨著現代應用程式對啟動速度、資源消耗和多語言支持的需求增加,JVM 的傳統優化方式也面臨挑戰。為了應對這些需求, GraalVM 應運而生。
在下一章節,我們將深入探討 GraalVM 的特性與優勢。這種基於 AOT(Ahead-of-Time)編譯 的虛擬機如何進一步優化 Java 應用的啟動速度,同時提供多語言支持和更靈活的編譯策略,將成為我們下一步的重點分析。
(已在章節補上GraalVM相關介紹)