百度T7前架構師淺談JVM架構原理

什麼是JVM?

虛擬機是物理機器的軟件實現。Java是用在VM上運行的WORA(Write Once Run Anywhere)概念而開發的。編譯器將Java文件編譯爲Java .class文件,然後將.class文件輸入到JVM中,JVM會加載並執行類文件。

 

這是JVM的架構圖

 

JVM基本概念

 

(1)基本概念:

JVM是可運行Java代碼的假想計算機 ,包括一套字節碼指令集、一組寄存器、一個棧、一個垃圾回收,堆 和 一個存儲方法域。JVM是運行在操作系統之上的,它與硬件沒有直接的交互。

(2) 運行過程:

我們都知道Java源文件,通過編譯器,能夠生產相應的.Class文件,也就是字節碼文件,而字節碼文件又通過Java虛擬機中的解釋器,編譯成特定機器上的機器碼 。

也就是如下

① Java源文件—->編譯器—->字節碼文件

② 字節碼文件—->JVM—->機器碼

每一種平臺的解釋器是不同的,但是實現的虛擬機是相同的,這也就是Java爲什麼能夠跨平臺的原因了 ,當一個程序從開始運行,這時虛擬機就開始實例化了,多個程序啓動就會存在多個虛擬機實例。程序退出或者關閉,則虛擬機實例消亡,多個虛擬機實例之間數據不能共享。

(3) 三種JVM:

  1. Sun公司的HotSpot
  2. BEA公司的JRockit
  3. IBM公司的J9 JVM

在JDK1.7及其以前我們所使用的都是Sun公司的HotSpot,但由於Sun公司和BEA公司都被oracle收購,Jdk1.8將採用Sun公司的HotSpot和BEA公司的JRockit兩個JVM中精華形成jdk1.8的JVM。

JVM如何工作?

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

  • 類加載器子系統(Class Loader Subsystem)
  • 運行時數據區(Runtime Data Area)
  • 執行引擎(Execution Engine)

一、類加載器子系統

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

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 算法。

2.鏈接

  1. 驗證——字節碼驗證器將驗證生成的字節碼是否正確,如果驗證失敗,我們將得到verification error。
  2. 準備——對於所有的靜態變量,內存將被分配和配置默認值。
  3. 解決——所有的符號存儲器引用都將替換爲來自Method Area的原始引用。

3.初始化

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

二、運行時數據區

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

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

(2)堆區域——所有對象及其對應的實例變量和數組將存儲在這裏。每個JVM也有一個堆區域。由於方法和堆區域共享多個線程的內存,因此所存儲的數據非線程安全。

(3)堆棧區——對於每個線程,將創建一個單獨的運行時棧。對於每個方法調用,將在堆棧存儲器中產生一個條目,稱爲堆棧幀。所有局部變量將在堆棧內存中創建。堆棧區域是線程安全的,因爲它不是共享資源。堆棧幀分爲三個子元素:

  • 局部變量數組:與方法相關,涉及局部變量,並在此存儲相應的值
  • 操作數堆棧:如果需要執行任何中間操作,操作數堆棧將充當運行時工作空間來執行操作
  • 幀數據:對應於方法的所有符號存儲在此處。在任何異常的情況下,捕獲的區塊信息將被保持在幀數據中;

(4)PC寄存器——每個線程都有單獨的PC寄存器,用於保存當前執行指令的地址,一旦指令執行,PC寄存器將更新到下一條指令。

(5)本地方法堆棧——本地方法堆棧保存本地方法信息。對於每個線程,將創建一個單獨的本地方法堆棧。

三、執行引擎

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

解釋器——解釋器解釋字節碼較快,但執行慢。解釋器的缺點是當一個方法被多次調用時,每次都需要新的解析。

JIT編譯器——JIT編譯器消除了解釋器的缺點。執行引擎將在轉換字節碼時使用解釋器的幫助,但是當它發現重複的代碼時,它使用JIT編譯器,編譯器會編譯整個字節碼並將其更改爲本地代碼。這個本地代碼將直接用於重複的方法調用,從而提高系統性能。

  • 中間代碼生成器:生成中間代碼
  • 代碼優化器:負責優化上面生成的中間代碼
  • 目標代碼生成器:負責生成機器代碼或本地代碼
  • 分析器:一個特殊組件,負責查找熱點,即該方法是否被多次調用;

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

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

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

本文對JVM架構只是概述, 作爲一名Java使用者,掌握JVM的體系結構是很有必要的

那如何學習才能快速入門並精通呢?

當真正開始學習的時候難免不知道從哪入手,導致效率低下影響繼續學習的信心。

但最重要的是不知道哪些技術需要重點掌握,學習時頻繁踩坑,最終浪費大量時間,所以有一套實用的視頻課程用來跟着學習是非常有必要的。

爲了讓學習變得輕鬆、高效,今天給大家免費分享一套阿里架構師傳授的一套教學資源。幫助大家在成爲架構師的道路上披荊斬棘。

這套視頻課程詳細講解了(Spring,MyBatis,Netty源碼分析,高併發、高性能、分佈式、微服務架構的原理,JVM性能優化、分佈式架構)等這些成爲架構師必備的內容!

而且還把框架需要用到的各種程序進行了打包,根據基礎視頻可以讓你輕鬆搭建分佈式框架環境,像在企業生產環境一樣進行學習和實踐。

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