您好,登錄后才能下訂單哦!
一般大家對JVM的了解可能停留在概念的層面上,而對于JVM的工作機制和體系結構了解相對較少。今天就跟大家聊聊Java中的JVM體系結構以及JVM的不同組件。
什么是JVM?
虛擬機是物理機的軟件實現。Java是根據WORA(可在任何地方寫入一次)的概念開發的,可在VM上運行。編譯器將Java文件編譯為Java .class文件,然后將該.class文件輸入到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..方法區域 – 所有類級別的數據都將存儲在這里,包括靜態變量。每個JVM只有一個方法區域,它是共享資源。
2.堆區– 所有對象及其對應的實例變量和數組將存儲在此處。 每個JVM還有一個堆區。由于“方法”和“堆”區域共享多個線程的內存,因此存儲的數據不是線程安全的。
3.堆棧區域 – 對于每個線程,將創建一個單獨的運行時堆棧。對于每個方法調用,將在堆棧存儲器中創建一個條目,稱為堆棧幀。所有局部變量都將在堆棧存儲器中創建。堆棧區域不是共享資源,因此是線程安全的。 堆棧框架分為三個子實體:
1.局部變量數組– 與該方法相關的涉及多少局部變量,并且相應的值將存儲在此處。
2.操作數棧 –如果需要執行任何中間操作,則操作數堆棧充當執行該操作的運行時工作區。
3.框架數據 – 與該方法相對應的所有符號都存儲在此處。 在任何例外情況下,捕獲塊信息都將保留在幀數據中。
4.PC寄存器 – 每個線程將具有單獨的PC寄存器,一旦執行該指令,將保存當前執行指令的地址,PC寄存器將用下一條指令更新。
5.本機方法堆棧– 本機方法堆棧保存本機方法信息。對于每個線程,將創建一個單獨的本機方法堆棧。
1.解釋器 – 解釋器解釋字節碼的速度較快,但執行速度較慢。解釋器的缺點是,當多次調用一種方法時,每次都需要新的解釋。
2.JIT編譯器 – JIT編譯器消除了解釋器的缺點。執行引擎將使用解釋器的幫助來轉換字節碼,但是當重復的代碼時,它將使用JIT編譯器,該編譯器將編譯整個字節碼并將其更改為本地代碼。此本地代碼將直接用于重復的方法調用,從而提高系統的能。
1.中間代碼生成器 – 生成中間代碼
2.代碼優化器 – 負責優化上面生成的中間代碼
3.目標代碼生成器 – 負責生成機器代碼或本機
4.Profiler – 一個特殊的組件,負責查找熱點,即是否多次調用該方法。
3.垃圾收集器: 收集并刪除未引用的對象。可以通過調用System.gc()來觸發垃圾回收,但是不能保證執行。JVM的垃圾收集收集創建的對象。
Java本機接口(JNI): JNI將與本機方法庫進行交互,并提供執行引擎所需的本機庫。
本機方法庫: 這是本機庫的集合,這是執行引擎所需的。
看完上述內容,你們對Java中的JVM體系結構以及JVM的不同組件有進一步的了解嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。