JVM 架構解讀

2016-10-24    分類:JAVA開發、程式設計開發、首頁精華0人評論發表於2016-10-24

本文由碼農網 – 小峰原創翻譯,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃

每個Java開發人員都知道位元組碼由JRE(Java執行時環境)執行。但許多人不知道JRE是Java Virtual Machine(JVM)的實現,它分析位元組碼,解釋程式碼並執行它。作為開發人員,我們應該知道JVM的架構是非常重要的,因為它使我們能夠更有效地編寫程式碼。在本文中,我們將更深入地瞭解Java中的JVM架構和JVM的不同元件。

什麼是JVM?

Virtual Machine是物理機器的軟體實現。Java是用在VM上執行的WORA(Write Once Run Anywhere)概念而開發的。編譯器將Java檔案編譯為Java .class檔案,然後將.class檔案輸入到JVM中,JVM會載入並執行類檔案。下面是JVM的架構圖。

JVM如何工作?

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

  1. 類載入器子系統
  2. 執行時資料區
  3. 執行引擎

1.類載入器子系統

Java的動態類載入功能由類載入器子系統處理。它在執行時,而不是編譯時首次引用類的時候載入、連結、並初始化類檔案。

1.1載入

類將通過此元件載入。Boot Strap Class Loader,Extension Class Loader和Application Class Loader是有助於實現的三個類載入器。

  1. Boot Strap Class Loader——負責載入來自於Bootstrap類路徑的類,就是rt.jar。此載入程式將給予最高優先順序。
  2. Extension Class Loader——負責載入在ext資料夾(jre \ lib)內的類。
  3. Application Class Loader——負責載入應用程式級類路徑,路徑提到環境變數等

上面的類記載器在載入類檔案時遵循Delegation Hierarchy 演算法。

1.2連結

  1. 驗證——位元組碼驗證器將驗證生成的位元組碼是否正確,如果驗證失敗,我們將得到verification error。
  2. 準備——對於所有的靜態變數,記憶體將被分配和配置預設值。
  3. 解決——所有的符號儲存器引用都將替換為來自Method Area的原始引用。

1.3初始化

這是類載入的最後階段,這裡所有的靜態變數都將被賦予原始值,並執行靜態塊。

2.執行時資料區

執行時資料區分為5個主要元件:

方法區——所有的類級別資料將儲存在這裡,包括靜態變數。每個JVM只有一個方法區,並且它是一個共享資源。

堆區域——所有物件及其對應的例項變數和陣列將儲存在這裡。每個JVM也有一個堆區域。由於方法和堆區域共享多個執行緒的記憶體,因此所儲存的資料非執行緒安全。

堆疊區——對於每個執行緒,將建立一個單獨的執行時棧。對於每個方法呼叫,將在堆疊儲存器中產生一個條目,稱為堆疊幀。所有區域性變數將在堆疊記憶體中建立。堆疊區域是執行緒安全的,因為它不是共享資源。堆疊幀分為三個子元素:

  1. 區域性變數陣列——與方法相關,涉及區域性變數以及將在此儲存的相應值的多少。
  2. 運算元堆疊——如果需要執行任何中間操作,那麼運算元堆疊將充當執行時工作空間來執行操作。
  3. 幀資料——對應於方法的所有符號儲存在此處。在任何異常的情況下,捕捉塊資訊將被保持在幀資料中。

PC暫存器——每個執行緒都有單獨的PC暫存器,用於儲存當前執行指令的地址,一旦指令執行,PC暫存器將更新到下一條指令。

本地方法堆疊——本地方法堆疊儲存本地方法資訊。對於每個執行緒,將建立一個單獨的本地方法堆疊。

3.執行引擎

分配給執行時資料區的位元組碼將由執行引擎執行。執行引擎讀取位元組碼並逐個執行它。

直譯器——直譯器解釋位元組碼較快,但執行慢。直譯器的缺點是當一個方法被多次呼叫時,每次都需要新的解析。

JIT編譯器——JIT編譯器消除了直譯器的缺點。執行引擎將在轉換位元組碼時使用直譯器的幫助,但是當它發現重複的程式碼時,它使用JIT編譯器,編譯器會編譯整個位元組碼並將其更改為原生程式碼。這個原生程式碼將直接用於重複的方法呼叫,從而提高系統效能。

  1. 中間程式碼生成器——生成中間程式碼
  2. 程式碼優化器——負責優化上面生成的中間程式碼
  3. 目的碼生成器——負責生成機器程式碼或原生程式碼
  4. 分析器——一個特殊元件,負責查詢熱點,即該方法是否被多次呼叫。

垃圾收集器:收集和刪除未引用的物件。可以通過呼叫“System.gc()”觸發垃圾收集器,但不能保證執行。JVM的垃圾回收收集建立的物件。

Java本機介面(JNI):JNI將與本地方法庫進行互動,並提供執行引擎所需的本地庫。

本地方法庫:它是執行引擎所需的本地庫的集合。

譯文連結:http://www.codeceo.com/article/jvm-architecture-explained.html
英文原文:The JVM Architecture Explained
翻譯作者:碼農網 – 小峰
轉載必須在正文中標註並保留原文連結、譯文連結和譯者等資訊。]

相關文章