精講 JVM架構體系介紹

每個Java開發人員都知道字節碼將由JRE(Java Runtime Environment)執行。但是許多人並不知道JRE是Java虛擬機(JVM)的實現,它可以分析字節碼,解釋代碼並執行它。作爲開發人員,瞭解JVM的體系結構非常重要,因爲它使我們能夠更高效地編寫代碼。

通過優銳課的jvm分享,在本文中,我們將更深入地瞭解Java中的JVM體系結構以及JVM的不同組件。分享給大家參考學習。

什麼是JVM?

虛擬機是物理機的軟件實現。Java是根據WORA(可在任何地方寫入一次)的概念開發的,可在VM上運行。編譯器將Java文件編譯爲Java .class文件,然後將該.class文件輸入到JVM中,JVM會加載並執行該類文件。下圖是JVM的體系結構圖。

JVM體系結構圖
精講 JVM架構體系介紹

JVM如何工作?

如上面的架構圖所示,JVM分爲三個主要子系統:
1.類加載器子系統
2.運行時數據區
3.執行引擎

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

1.1加載
類將由該組件加載。引導類裝入器、擴展類裝入器和應用程序類裝入器是有助於實現它的三個類裝入器。

1.引導程序類加載器–負責從引導類路徑加載類,除了rt.jar此加載程序將獲得最高優先級。
2.擴展類加載器–負責加載ext文件夾中的類
3.應用程序類加載器–負責加載應用程序級類路徑、提到的環境變量路徑等。
在加載類文件時,上面的類加載器將遵循委託層次算法。

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

1.3初始化
這是類加載的最後階段;此處,所有靜態變量將被分配原始值,並執行靜態塊。

  1. 運行時數據區
    運行時數據區分爲五個主要部分:

1..方法區域 – 所有類級別的數據都將存儲在這裏,包括靜態變量。每個JVM只有一個方法區域,它是共享資源。
2.堆區– 所有對象及其對應的實例變量和數組將存儲在此處。 每個JVM還有一個堆區。由於“方法”和“堆”區域共享多個線程的內存,因此存儲的數據不是線程安全的。
3.堆棧區域 – 對於每個線程,將創建一個單獨的運行時堆棧。對於每個方法調用,將在堆棧存儲器中創建一個條目,稱爲堆棧幀。所有局部變量都將在堆棧存儲器中創建。堆棧區域不是共享資源,因此是線程安全的。 堆棧框架分爲三個子實體:

1.局部變量數組– 與該方法相關的涉及多少局部變量,並且相應的值將存儲在此處。
2.操作數棧 –如果需要執行任何中間操作,則操作數堆棧充當執行該操作的運行時工作區。
3.框架數據 – 與該方法相對應的所有符號都存儲在此處。 在任何例外情況下,捕獲塊信息都將保留在幀數據中。
4.PC寄存器 – 每個線程將具有單獨的PC寄存器,一旦執行該指令,將保存當前執行指令的地址,PC寄存器將用下一條指令更新。
5.本機方法堆棧– 本機方法堆棧保存本機方法信息。對於每個線程,將創建一個單獨的本機方法堆棧。

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

1.解釋器 – 解釋器解釋字節碼的速度較快,但執行速度較慢。解釋器的缺點是,當多次調用一種方法時,每次都需要新的解釋。
2.JIT編譯器 – JIT編譯器消除了解釋器的缺點。執行引擎將使用解釋器的幫助來轉換字節碼,但是當重複的代碼時,它將使用JIT編譯器,該編譯器將編譯整個字節碼並將其更改爲本地代碼。此本地代碼將直接用於重複的方法調用,從而提高系統的能。

1.中間代碼生成器 – 生成中間代碼
2.代碼優化器 – 負責優化上面生成的中間代碼
3.目標代碼生成器 – 負責生成機器代碼或本機
4.Profiler – 一個特殊的組件,負責查找熱點,即是否多次調用該方法。
3.垃圾收集器: 收集並刪除未引用的對象。可以通過調用System.gc()來觸發垃圾回收,但是不能保證執行。JVM的垃圾收集收集創建的對象。
Java本機接口(JNI): JNI將與本機方法庫進行交互,並提供執行引擎所需的本機庫。

本機方法庫: 這是本機庫的集合,這是執行引擎所需的。

喜歡這篇文章的可以點個贊,歡迎大家留言評論,記得關注我,每天持續更新技術乾貨、職場趣事、海量面試資料等等
 > 如果你對java技術很感興趣也可以交流學習,共同學習進步。 
不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代

文章寫道這裏,歡迎完善交流。最後奉上近期整理出來的一套完整的java架構思維導圖,分享給大家對照知識點參考學習。有更多JVM、Mysql、Tomcat、Spring Boot、Spring Cloud、Zookeeper、Kafka、RabbitMQ、RockerMQ、Redis、ELK、Git等Java乾貨

精講 JVM架構體系介紹

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