JVM 架構解讀
本文由碼農網 – 小峰原創翻譯,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃!
每個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.類載入器子系統
Java的動態類載入功能由類載入器子系統處理。它在執行時,而不是編譯時首次引用類的時候載入、連結、並初始化類檔案。
1.1載入
類將通過此元件載入。Boot Strap Class Loader,Extension Class Loader和Application Class Loader是有助於實現的三個類載入器。
- Boot Strap Class Loader——負責載入來自於Bootstrap類路徑的類,就是rt.jar。此載入程式將給予最高優先順序。
- Extension Class Loader——負責載入在ext資料夾(jre \ lib)內的類。
- Application Class Loader——負責載入應用程式級類路徑,路徑提到環境變數等
上面的類記載器在載入類檔案時遵循Delegation Hierarchy 演算法。
1.2連結
- 驗證——位元組碼驗證器將驗證生成的位元組碼是否正確,如果驗證失敗,我們將得到verification error。
- 準備——對於所有的靜態變數,記憶體將被分配和配置預設值。
- 解決——所有的符號儲存器引用都將替換為來自Method Area的原始引用。
1.3初始化
這是類載入的最後階段,這裡所有的靜態變數都將被賦予原始值,並執行靜態塊。
2.執行時資料區
執行時資料區分為5個主要元件:
方法區——所有的類級別資料將儲存在這裡,包括靜態變數。每個JVM只有一個方法區,並且它是一個共享資源。
堆區域——所有物件及其對應的例項變數和陣列將儲存在這裡。每個JVM也有一個堆區域。由於方法和堆區域共享多個執行緒的記憶體,因此所儲存的資料非執行緒安全。
堆疊區——對於每個執行緒,將建立一個單獨的執行時棧。對於每個方法呼叫,將在堆疊儲存器中產生一個條目,稱為堆疊幀。所有區域性變數將在堆疊記憶體中建立。堆疊區域是執行緒安全的,因為它不是共享資源。堆疊幀分為三個子元素:
- 區域性變數陣列——與方法相關,涉及區域性變數以及將在此儲存的相應值的多少。
- 運算元堆疊——如果需要執行任何中間操作,那麼運算元堆疊將充當執行時工作空間來執行操作。
- 幀資料——對應於方法的所有符號儲存在此處。在任何異常的情況下,捕捉塊資訊將被保持在幀資料中。
PC暫存器——每個執行緒都有單獨的PC暫存器,用於儲存當前執行指令的地址,一旦指令執行,PC暫存器將更新到下一條指令。
本地方法堆疊——本地方法堆疊儲存本地方法資訊。對於每個執行緒,將建立一個單獨的本地方法堆疊。
3.執行引擎
分配給執行時資料區的位元組碼將由執行引擎執行。執行引擎讀取位元組碼並逐個執行它。
直譯器——直譯器解釋位元組碼較快,但執行慢。直譯器的缺點是當一個方法被多次呼叫時,每次都需要新的解析。
JIT編譯器——JIT編譯器消除了直譯器的缺點。執行引擎將在轉換位元組碼時使用直譯器的幫助,但是當它發現重複的程式碼時,它使用JIT編譯器,編譯器會編譯整個位元組碼並將其更改為原生程式碼。這個原生程式碼將直接用於重複的方法呼叫,從而提高系統效能。
- 中間程式碼生成器——生成中間程式碼
- 程式碼優化器——負責優化上面生成的中間程式碼
- 目的碼生成器——負責生成機器程式碼或原生程式碼
- 分析器——一個特殊元件,負責查詢熱點,即該方法是否被多次呼叫。
垃圾收集器:收集和刪除未引用的物件。可以通過呼叫“System.gc()”觸發垃圾收集器,但不能保證執行。JVM的垃圾回收收集建立的物件。
Java本機介面(JNI):JNI將與本地方法庫進行互動,並提供執行引擎所需的本地庫。
本地方法庫:它是執行引擎所需的本地庫的集合。
譯文連結:http://www.codeceo.com/article/jvm-architecture-explained.html
英文原文:The JVM Architecture Explained
翻譯作者:碼農網 – 小峰
[ 轉載必須在正文中標註並保留原文連結、譯文連結和譯者等資訊。]
相關文章
- jvm架構JVM架構
- JVM架構哪些事JVM架構
- “阿里架構師”的JVM之GC詳解阿里架構JVMGC
- 阿里雲架構師解讀三大主流遊戲架構阿里架構遊戲
- java之JVM的架構模型JavaJVM架構模型
- 阿里雲架構師解讀四大主流遊戲架構阿里架構遊戲
- jvm結構解釋JVM
- 一文讀懂微服務架構——【詳解】微服務架構
- Apache Hudi 設計與架構最強解讀Apache架構
- MySQL調優篇 | 邏輯架構解讀(1)MySql架構
- 架構解讀:如何快速搭建直播答題方案架構
- 《架構基礎 從需求到架構》讀書架構
- 解讀JVM虛擬機器JVM虛擬機
- 讀《前端架構設計》 兼談架構與框架前端架構框架
- 獨家解讀 | 滴滴機器學習平臺架構演進之路機器學習架構
- Netty-Channel架構體系原始碼解讀Netty架構原始碼
- 詳細解讀!推薦演算法架構——召回演算法架構
- 技術架構解讀:直播答題如何組隊架構
- 阿里架構師帶你深入淺出jvm阿里架構JVM
- JVM全方位解讀(附面試題)JVM面試題
- 軟體架構師或解決方案架構師必讀的五本書 - javarevisited架構Java
- 賽事直播解說+連麥,技術架構難點解讀架構
- 解讀架構,框架,模式,構件,元件,中介軟體之間區別架構框架模式元件
- “阿里架構師”kafka 資料可靠性深度解讀阿里架構Kafka
- 雲端儲存架構三種經典流派全解讀架構
- Java常見知識點彙總(⑮)——Jvm架構JavaJVM架構
- Java虛擬機器:JVM架構與垃圾回收Java虛擬機JVM架構
- 品讀鴻蒙HDF架構(二)鴻蒙架構
- RabbitMQ架構詳解(7大架構原理模型圖解)MQ架構模型圖解
- JVM筆記 -- JVM的發展以及基於棧的指令集架構JVM筆記架構
- 重讀 JVMJVM
- Serverless 選型:深度解讀 Serverless 架構及平臺選擇Server架構
- 戴爾易安信靈動架構“首秀”,PowerEdge MX解讀架構
- Rancher首席架構師解讀Fleet:它何以管理百萬叢集?架構
- 架構師能力升級:掌握JVM科學調優架構JVM
- 淺談JVM整體架構與調優引數JVM架構
- iOS架構詳解iOS架構
- 閱讀筆記——架構漫談筆記架構