【JVM】12、執行引擎

執行引擎概述

執行引擎屬於JVM的下層,裏面包括:解釋器、即時編譯器、垃圾回收器
在這裏插入圖片描述

在這裏插入圖片描述

執行引擎

  1. 執行引擎是Java虛擬機核心的組成部分之一。“虛擬機”是一個相對於“物理機”的概念,這兩種機器都有代碼執行能力,其區別是物理機的執行引擎是直接建立在處理器、緩存、指令集和操作系統層面上的,而虛擬機的執行引擎則是由軟件自行實現的,因此可以不受物理條件制約地定製指令集與執行引擎的結構體系,能夠執行那些不被硬件直接支持的指令集格式。
  2. JVM的主要任務是負責裝載字節碼到其內部,**但字節碼並不能夠直接運行在操作系統之上,**因爲字節碼指令並非等價於本地機器指令,它內部包含的僅僅只是一些能夠被JVM所識別的字節碼指令、符號表,以及其他輔助信息。
  3. 那麼,如果想要讓一個Java程序運行起來,執行引擎(Execution Engine)的任務就是將字節碼指令解釋/編譯爲對應平臺上的本地機器指令纔可以。簡單來說,JVM中的執行引擎充當了將高級語言翻譯爲機器語言的譯者。
    在這裏插入圖片描述

執行引擎的工作過程

  • 執行引擎在執行的過程中究竟需要執行什麼樣的字節碼指令完全依賴於PC寄存器。
  • 每當執行完一項指令操作後,PC寄存器就會更新下一條需要被執行的指令地址。
  • 當然方法在執行的過程中,執行引擎有可能會通過存儲在局部變量表中的對象引用準確定位到存儲在Java堆區中的對象實例信息,以及通過對象頭中的元數據指針定位到目標對象的類型信息。
  • 從外觀上來看,所有的Java虛擬機的執行引擎輸入、處理、輸出都是一致的:輸入的是字節碼二進制流,處理過程是字節碼解析執行、即時編譯的等效過程,輸出的是執行過程。
    在這裏插入圖片描述

Java 代碼編譯和執行過程

解釋執行和即時編譯

大部分的程序代碼轉換成物理機的目標代碼或虛擬機能執行的指令集之前,都需要經過下圖中的各個步驟:
在這裏插入圖片描述

  • 橙色:javac前端編譯器的過程,通過遍歷抽象語法樹,生成線性的字節碼文件。(與JVM是沒關係的)
    在這裏插入圖片描述

  • JVM考慮執行的過程:

    • 綠色:解釋執行
    • 藍色:即時編譯

在這裏插入圖片描述

解釋器

解釋器(Interpreter):當Java虛擬機啓動時會根據預定義的規範對字節碼採用逐行解釋的方式執行,將每條字節碼文件中的內容“翻譯”爲對應平臺的本地機器指令執行。

JIT編譯器

JIT(Just In Time Compiler)編譯器:就是虛擬機將源代碼直接編譯成和本地機器平臺相關的機器語言。
並不會馬上執行

爲什麼Java是半編譯半解釋型語言?

因爲現在JVM在執行Java代碼的時候,通常都會將解釋執行與編譯執行二者結合起來進行。
將字節碼翻譯成本地代碼後,就可以做一個緩存操作,存儲在方法區的JIT 代碼緩存中

機器碼、指令、彙編語言

機器碼

  • 各種用二進制編碼方式表示的指令,叫做機器指令碼。開始,人們就用它採編寫程序,這就是機器語言。
  • 機器語言雖然能夠被計算機理解和接受,但和人們的語言差別太大,不易被人們理解和記憶,並且用它編程容易出差錯。
  • 用它編寫的程序一經輸入計算機,CPU直接讀取運行,因此和其他語言編的程序相比,執行速度最快。
  • 機器指令與CPU緊密相關,所以不同種類的CPU所對應的機器指令也就不同。

指令和指令集

指令

  • 由於機器碼是由0和1組成的二進制序列,可讀性實在太差,於是人們發明了指令。
  • 指令就是把機器碼中特定的0和1序列,簡化成對應的指令(一般爲英文簡寫,如mov,inc等),可讀性稍好
  • **由於不同的硬件平臺,執行同一個操作,對應的機器碼可能不同,所以不同的硬件平臺的同一種指令(比如mov),對應的機器碼也可能不同。

指令集

不同的硬件平臺,各自支持的指令,是有差別的。因此每個平臺所支持的指令,稱之爲對應平臺的指令集。如常見的:

  • x86指令集,對應的是x86架構的平臺
  • ARM指令集,對應的是ARM架構的平臺

彙編語言

  • 由於指令的可讀性還是太差,於是人們又發明了彙編語言。
  • 在彙編語言中,用助記符(Mnemonics)代替機器指令的操作碼用地址符號(Symbol)或標號(Label)代替指令或操作數的地址。在不同的硬件平臺,彙編語言對應着不同的機器語言指令集,通過彙編過程轉換成機器指令。
  • 由於計算機只認識指令碼,所以用匯編語言編寫的程序還必須翻譯(彙編)成機器指令碼,計算機才能識別和執行。

高級語言

  • 爲了使計算機用戶編程序更容易些,後來就出現了各種高級計算機語言。

  • 高級語言比機器語言、彙編語言更接近人的語言當計算機執行高級語言編寫的程序時,仍然需要把程序解釋和編譯成機器的指令碼。完成這個過程的程序就叫做解釋程序或編譯程序。

  • 高級語言也不是直接翻譯成 機器指令

    • 首先需要通過編譯階段,將高級語言翻譯爲爲彙編語言
    • 再通過彙編階段,將生成的彙編語言翻譯成機器指令

在這裏插入圖片描述

字節碼

  • 字節碼是一種中間狀態(中間碼)的二進制代碼(文件),它比機器碼更抽象,需要直譯器轉譯後才能成爲機器碼
  • 字節碼主要爲了實現特定軟件運行和軟件環境、與硬件環境無關
  • 字節碼的實現方式是通過編譯器和虛擬機器。編譯器將源碼編譯成字節碼,特定平臺上的虛擬機器將字節碼轉譯爲可以直接執行的指令。
  • 字節碼典型的應用爲:Java bytecode
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章