原文地址:《The JVM Architecture Explained 》java
每一個Java開發者都知道字節碼是被JRE(Java運行時環境)所執行的。可是許多人並不知道實際上JRE是Java虛擬機(JVM)的實現。它分析字節碼,解釋代碼並執行它。做爲一個開發者,瞭解JVM的體系結構是很是重要的,由於它使咱們能更有效的編寫代碼。在這篇文章中,咱們將更深刻的瞭解Java中的JVM體系結構和JVM的不一樣組件。數組
虛擬機是物理機器的軟件實現。Java語言當時是基於編寫一次處處運行的理念被開發出來的,其中處處運行指的是運行在虛擬機上。編譯器將java文件編譯成.class文件,而後.class文件被輸入到JVM中,JVM會加載並運行這些.class文件。下圖展現了JVM的體系結構。安全
JVM體系結構 多線程
正如上圖展現的,JVM被分爲如下三個主要的子系統:jvm
Java的動態類加載功能是由類加載子系統處理。它加載,連接,並初始化類(當在運行時第一次引用該類時)。性能
類都經過該組件進行加載。BootStrap ClassLoader、 Extension ClassLoader、Application ClassLoader這三個類加載器協同完成這個目標。優化
以上這些類加載器將遵循雙親委託機制裝載類文件。(即當一個類須要加載時,先從Bootstrap加載,沒有的話,再從Extension加載,仍是沒有的話,才從Application加載。)線程
這是類加載的最後階段。全部靜態變量將會被賦予初始值而且靜態構造塊將會被執行。翻譯
運行時數據區被分爲五個主要的區域。3d
分配到運行時數據區的字節碼將會被執行引擎執行。執行引擎將會讀取字節碼並逐個執行。
解釋器:解釋器解釋字節碼快,但執行慢。而且在屢次調用同一個方法時,都須要從新解釋。
JIT編譯器:JIT編譯器彌補瞭解釋器的缺點。執行引擎會藉助解釋器去轉換字節碼。可是當它發現有重複的代碼時,會使用JIT去編譯整份字節碼並將它改成本地代碼。本地代碼將會被直接使用在重複的方法調用,從而提升系統的性能。
垃圾回收器:回收和刪除未被引用的對象。垃圾回收可被System.gc()方法觸發,可是不保證立馬執行。