iT邦幫忙

2024 iThome 鐵人賽

DAY 12
1
Software Development

微服務奇兵:30天Quarkus特訓營系列 第 12

GraalVM快速理解-關於JVM架構實作(HotSpot)

  • 分享至 

  • xImage
  •  

在前面的章節中,我們介紹了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

HotSpot JVM 是 Java 虛擬機家族中最受歡迎的版本之一,由 Oracle 公司開發,並作為標準的 JVM 隨 Java Development Kit(JDK)一同分發。它的廣泛使用源於性能、可擴展性和兼容性各方面的優勢。

HotSpot架構

HotSpot JVM 的架構如下圖
https://ithelp.ithome.com.tw/upload/images/20240913/201158950B5wOF70IS.png

架構整體上大致與上一章節介紹的框架概念圖相同,但在實作上,我們通常會聚焦於 Execution Engine(執行引擎) 的部分。其中一個非常重要的組件是 JIT Compiler(即時編譯器)。JIT 編譯器的作用是當程式運行時,將需要執行的 Java 字節碼動態編譯成機器碼,從而讓處理器能夠直接讀取並執行這些編譯後的機器碼。

主要組件介紹

  • Class Loader (類加載器):負責將 .class 文件(編譯後的 Java 類)加載到 JVM 的記憶體中,以便執行。
  • Execution Engine (執行引擎):JVM 的核心部分,負責解釋或編譯 Java 字節碼並將其轉換成機器碼執行。這部分包含了 JIT 編譯器、垃圾回收器等。
  • Garbage Collector (垃圾回收器):自動管理記憶體,回收不再被使用的物件,避免記憶體洩漏。
  • Runtime Data Areas (運行時數據區域)
    • Heap (堆區):用來存儲所有 Java 物件和數組。
    • Method Area (方法區):儲存類別的中繼資料、常數、方法程式碼等。
    • Stack :每個 Java 執行緒有自己獨立的Stack,存儲局部變量、方法調用等數據。

主要特點

  • 即時編譯 (JIT):HotSpot JVM 的核心之一是其 JIT 編譯技術。JIT 允許 JVM 在程式運行時動態地將常用的 Java 字節碼編譯為本地機器碼,從而提升執行效率。JIT 編譯器基於「熱點」分析,會優先對那些被頻繁執行的程式碼進行編譯和優化。
  • 垃圾回收 (GC):HotSpot 擁有多種垃圾回收策略,可以根據應用程序的需求選擇合適的垃圾回收器。例如:
    • Serial GC:適用於單執行緒的應用,適合小型應用或嵌入式系統。
    • Parallel GC:能夠在多核處理器上同時回收多個區域的記憶體,適合伺服器端應用。
    • G1 GC (Garbage-First):一種更加現代的垃圾回收器,設計用於高併發、低延遲的應用場景。
  • 記憶體管理:提供了靈活的記憶體管理,將 JVM 的運行時數據劃分為多個區域(如堆區、方法區、程式計數器等),每個區域都有特定的用途,幫助 JVM 在處理不同類型數據時更加高效。
  • 多層次編譯架構:採用了 C1(Client Compiler)C2(Server Compiler)兩種 JIT 編譯器。C1 編譯器針對快速啟動和低延遲進行優化,而 C2 編譯器則針對長時間運行的程式碼進行深度優化,適合伺服器應用。
  • 性能分析與調優:整合各種性能分析工具,如 JVM ProfilingJFR (Java Flight Recorder)JIT 日誌等,幫助開發者深入了解應用程式在 JVM 上的運行狀態,並根據分析結果進行性能調優。

JIT 編譯器的特點是能夠在程式運行時,動態判斷哪些程式碼被頻繁執行,並針對這些「熱點」程式碼進行編譯和優化。這與 GraalVM 所採用的 AOT(Ahead-of-Time 編譯)技術不同,後者是在應用程式運行之前,將所有程式碼預先編譯成機器碼。關於這部分的詳細內容,請看前述章節GraalVM介紹。

JIT Complier

HotSpot 的名稱源於其「熱點」檢測和優化技術。JVM 在運行時會監控程式,找出那些被頻繁執行的程式碼(即熱點程式碼)

JIT 編譯器的組成

JIT 編譯器由兩個主要部分組成,分別是 C1 (Client Compiler)C2 (Server Compiler),它們針對不同的應用場景進行編譯和優化。其架構圖如下

https://ithelp.ithome.com.tw/upload/images/20240913/20115895LQmmI1lvr9.png

C1 (Client Compiler)

C1 編譯器是一個 初級編譯器,在應用程式剛啟動、程式碼首次被執行時,C1 會迅速地將字節碼編譯成機器碼,以便應用能夠立即運行。C1 的主要目的是提供 快速啟動低延遲,使應用能夠迅速響應用戶的請求。

  • 目標:快速啟動、低延遲
  • 特點
    • C1 編譯器的編譯速度非常快,但相對於 C2 編譯器來說,生成的機器碼優化程度不如 C2 高。
    • 適合需要快速啟動且對長時間運行優化要求不高的應用,例如桌面應用或某些短期任務的執行。

C1 的設計是為了在啟動階段提供快速的編譯體驗,這樣應用程式能夠快速運行,且程式碼可以在短時間內被多次執行。隨著程式運行時間增長,JVM 會將重點轉向 C2 編譯器來進行深度優化。

C2 (Server Compiler)

C2 編譯器是 高級編譯器,主要負責對**「熱點」**程式碼進行深入的優化。當 JVM 檢測到某段程式碼被頻繁運行(即識別為熱點程式碼)後,會將這段程式碼交給 C2 編譯器,C2 編譯器會針對這些「熱點」進行更深層次的編譯和優化,生成運行速度更快、性能更高的機器碼。

  • 目標:提供最高的執行速度,對重點程式碼進行深度優化
  • 特點
    • C2 編譯器會花費更多時間進行編譯和優化,但生成的機器碼非常高效,能顯著提升熱點程式碼的運行性能。
    • 適合長時間運行且對性能有嚴格要求的應用,例如後端服務、伺服器應用或高並發系統。

由於 C2 編譯器會對「熱點」進行大量的優化,因此它適合用於那些需要持續運行的伺服器端應用程式,這類應用的關鍵程式碼片段可能會被執行數百萬次。透過 C2 的深入優化,能夠顯著減少 CPU 的佔用時間,從而提高整體性能。

JIT 編譯工作流程

Step1 : 啟動階段:當應用啟動時,JVM 首先會使用解釋器逐行解釋字節碼執行,並且啟用 C1 編譯器 來快速編譯那些最初被執行的程式碼,保證程式快速啟動並能夠迅速運行。

Step2 : 熱點檢測:隨著應用的運行,JVM 會檢測哪些程式碼被頻繁執行。這些頻繁執行的程式碼會被標記為「熱點」。

Step3 : 深入優化:一旦某些程式碼被標記為熱點,JVM 會將它們交給 C2 編譯器 進行更高級的優化。C2 編譯器會生成高度優化的機器碼,使得這些程式碼在後續執行中達到最高的運行效率。

總結來說,HotSpot JVM 透過「熱點」檢測和即時編譯(JIT)技術,在提供高效執行性能的同時,保證了 Java 應用的穩定性和擴展性。然而,隨著現代應用程式對啟動速度、資源消耗和多語言支持的需求增加,JVM 的傳統優化方式也面臨挑戰。為了應對這些需求, GraalVM 應運而生。

在下一章節,我們將深入探討 GraalVM 的特性與優勢。這種基於 AOT(Ahead-of-Time)編譯 的虛擬機如何進一步優化 Java 應用的啟動速度,同時提供多語言支持和更靈活的編譯策略,將成為我們下一步的重點分析。
(已在章節補上GraalVM相關介紹)


上一篇
VisualVM 監控工具
下一篇
後端協定基礎知識建置-SSL TLS 解析
系列文
微服務奇兵:30天Quarkus特訓營30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言