JVM架構解釋

翻譯自:https://dzone.com/articles/jvm-architecture-explained

每個Java開發人員都知道字節碼將由JRE(Java運行時環境)執行。但許多人不知道JRE是Java虛擬機(JVM)的實現,它先分析字節碼,解釋代碼,並在最後執行它。作爲開發人員,我們應該瞭解JVM的體系結構,因爲它使我們能夠更有效地編寫代碼。在本文中,我們將更深入地瞭解Java中的JVM體系結構以及JVM的不同組件。

什麼是JVM?

虛擬機是一種物理計算機的軟件實現。Java是在WORA(Write Once Run Anywhere的概念下開發的, 它在VM上運行。通過編譯器 將Java文件編譯轉換成一個.class文件,然後將該.class文件輸入到JVM,它加載並執行.class文件。下面是JVM的體系結構圖。

JVM架構圖

JVM架構圖

JVM如何工作?

如上面的架構圖所示,JVM分爲三個主要子系統:

  1. 類加載器子系統
  2. 運行時數據區
  3. 執行引擎

 

1.類加載器子系統

Java的動態類加載功能由類加載器子系統處理。它加載, 鏈接,並初始化類文件, 第一次引用類是當它在運行時, 而不是編譯時。

1.1加載(Loading)

這個組件將加載類。BootStrap類Loader,Extension類Loader和Application類Loader是三個類加載器,它將有助於實現它。

  1. Boot Strap ClassLoader - 負責從引導類路徑加載類,只有rt.jar。該裝載機將獲得最高優先級。
  2. Extension ClassLoader - 負責加載ext文件夾(jre \ lib)中的類。
  3. Application ClassLoader -負責加載應用程序級別類路徑,路徑提到環境變量等。

上面的類加載器將在加載類文件時遵循委託層次結構算法。

1.2鏈接(Linking)

  1. 驗證 - 字節碼驗證程序將驗證生成的字節碼是否正確,如果驗證失敗,我們將收到驗證錯誤。
  2. 準備 - 對於所有靜態變量,將分配內存併爲其分配默認值。
  3. 解決 - 所有符號內存引用都替換爲方法區域中的原始引用。

1.3初始化(Initialization)

這是類加載的最後階段,這裏 將爲所有靜態變量分配原始值,並執行靜態塊

 

2.運行時數據區-Runtime Data Area

運行時數據區分爲5個主要組件:

  1. 方法區域(Method Area) - 所有類級別數據都將存儲在此處,包括靜態變量。每個JVM只有一個方法區域,它是一個共享資源。
  2. 堆區域(Heap Area) - 所有對象及其對應的實例變量和數組將存儲在此處。每個JVM還有一個堆區域。由於Method和Heap區域共享多個線程的內存,因此存儲的數據不是線程安全的。
  3. 堆棧區域(Stack Area) - 對於每個線程,將創建單獨的運行時堆棧。對於每個方法調用,將在堆棧存儲器中創建一個條目,稱爲堆棧幀。將在堆棧內存中創建所有局部變量。堆棧區域是線程安全的,因爲它不是共享資源。堆棧框架分爲三個子實體:
    1. 局部變量數組(Local Variable Array) - 與方法有關,涉及多少局部變量,相應的值將存儲在此處。
    2. 操作數堆棧(Operand stack) - 如果需要執行任何中間操作,則操作數堆棧充當運行時工作空間以執行操作。
    3. 幀數據(Frame data) - 此方法存儲與該方法對應的所有符號。在任何異常的情況下,捕獲塊信息將保留在幀數據中。
  4. PC寄存器(PC Registers) - 每個線程都有單獨的PC寄存器,一旦執行指令就保持當前執行指令的地址,PC寄存器將用下一條指令更新。
  5. Native Method stacks- Native Method Stack保存本機方法信息。對於每個線程,將創建單獨的本機方法堆棧。

 

3.執行引擎

分配給運行時數據區的字節碼將由執行引擎執行。執行引擎讀取字節碼並逐個執行。

  1. 解釋器(Interpreter) - 解釋器會更快速地解釋字節碼, 但執行速度較慢。解釋器的缺點是, 當一個方法被多次調用時, 每次都需要一個新的解釋。
  2. JIT編譯器(JIT Compiler) - JIT編譯器中和了解釋器的缺點。執行引擎將使用解釋器的幫助來轉換字節代碼,但是當它找到重複的代碼時,它使用JIT編譯器,它編譯整個字節碼並將其更改爲本機代碼。此本機代碼將直接用於重複的方法調用,從而提高系統的性能。
    1. 中間代碼生成器(Intermediate Code generator) - 生成中間代碼
    2. 代碼優化器(Code Optimizer) - 負責優化上面生成的中間代碼
    3. 目標代碼生成器(Target Code Generator) - 負責生成機器代碼或本機代碼
    4. Profiler - 一個特殊組件,負責查找熱點,即該方法是否被多次調用。
  3. 垃圾收集器(Garbage Collector):收集和刪除未引用的對象。可以通過調用觸發垃圾收集System.gc(),但不保證執行。JVM的垃圾收集收集創建的對象。

Java Native Interface(JNI):JNI將與Native Method Libraries交互,並提供執行引擎所需的本機庫。

本機方法庫(Native Method Libraries):這是執行引擎所需的本機庫的集合。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章