1. 程式人生 > >JVM解讀(一):JVM體系結構

JVM解讀(一):JVM體系結構

JVM全稱是java Virtual Machine(java虛擬機器),JVM遮蔽了與各個計算機平臺相關的軟體和硬體差異
在接下來的日子裡,我要通過寫部落格的形式學習JVM,讓自己更懂得Java
本系列文章是對《深入分析javaweb技術內幕》和《深入理解java虛擬機器》的總結,歡迎大家一起吐槽,一起進步

JVM體系結構

JVM的基本組成
(1)指令集:JVM指令集
(2)類載入器:在jvm啟動時或者類在執行時將需要的class載入到JVM中
(3)執行引擎:負責執行class檔案中的位元組碼指令,相當於CPU
(4)執行時資料區:將記憶體劃分成若干個區,分別完成不同的任務
(5)本地方法區:呼叫C或C++實現的本地方法程式碼返回的結果
jvm體系結構

  1. 類載入器ClassLoader

    會在下一篇文章中詳細說明ClassLoader載入機制。每一個被JVM裝載的型別都有一個與之對應的java.lang.Class類的例項來表示該型別。該例項可以唯一表示被jvm裝載的class類,這個例項和其他類的例項一樣放在堆記憶體中。

  2. 執行引擎
    執行引擎相當於執行緒,是JVM的核心,執行引擎的作用就是解析JVM位元組碼指令,得到執行的結果。執行引擎由各個廠家實現。SUN的hotspot是一種基於棧的執行引擎。而Android的Dalvik是基於暫存器的執行引擎。執行引擎也就是執行一條條程式碼的一個流程,程式碼都包含在方法體中,執行引擎本質上就是執行一個個方法串起來的流程,對應於作業系統的一個執行緒,每個java執行緒就是一個執行引擎的例項。
    java執行部件

  3. java記憶體管理
    執行引擎在執行的過程中需要儲存一些東西,如運算元,操作碼執行結果,class類的位元組碼以及類的物件等資訊都需要在執行引擎執行前準備就緒。JVM有一個方法區,java堆區,java棧,PC暫存器和本地方法區。其中方法區和java堆是執行緒共享的。如果當前執行緒對應的java棧中沒有棧幀,這個java棧也要被JVM撤銷,整個JVM退出。

JVM選擇基於棧的架構的原因

  JVM執行位元組碼指令是基於棧的架構的,所有的運算元必須先入棧,然後根據指令的操作碼選擇從棧頂彈出若干個元素進行計算後再將結果入棧。JVM運算元可以存放在每一個棧幀中的一個本地變數中,即每個方法呼叫時就會給這個方法分配一個本地變數集,這個本地變數集在編譯時就已經確定,所以運算元入棧可以直接是常量或者從本地變數集中娶一個變數壓入棧中。
  JVM基於棧的設計理由是
  (1)JVM要設計成與平臺無關的,而平臺無關性就要保證在沒有或者由很少的暫存器的機器上也能同樣正確執行java程式碼,因為暫存器很難做到通用。
  (2)基於棧的理由是為JVM更好地優化程式碼而設計的
  (3)為了指令的緊湊性,因為java程式碼可能在網路上傳輸,所以class檔案的大小也是設計JVM位元組碼指令的一個重要因素。

宣告:本文很多是對《深入分析javaweb技術內幕》和《深入理解java虛擬機器》的總結