日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

JVM_05 执行引擎(Execution Engine)

發布時間:2025/3/15 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JVM_05 执行引擎(Execution Engine) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

總結寫在最前面:

一、 執行引擎概述

①. 執行引擎是Java虛擬機的核心組成部分之一

②. JVM的主要任務是負責裝載字節碼到其內部,但字節碼并不能夠直接運行在操作系統之上,因為字節碼指令并非等價于本地機器指令,它內部包含的僅僅只是一些能夠被JVM鎖識別的字節碼指令、符號表和其他輔助信息

③. 那么,如果想讓一個Java程序運行起來、執行引擎的任務就是將字節碼指令解釋/編譯為對應平臺上的本地機器指令才可以。簡單來說,JVM中的執行引擎充當了將高級語言翻譯為機器語言的譯者

④. 執行引擎的工作過程 (從外觀上來看,所有的Java虛擬機的執行引擎輸入、輸出都是一致的:輸入的是字節碼二進制流,處理過程是字節碼解析執行的等效過程,輸出的是執行結果)

  • 執行引擎在執行的過程中究竟需要執行什么樣的字節碼指令完全依賴于PC寄存器
  • 每當執行完一項指令操作后,PC寄存器就會更新下一條需要被執行的指令地址
  • 當然方法在執行的過程中,執行引擎有可能會通過存儲在局部變量表中的對象引用準確定位到存儲在Java堆區中的對象實例信息,以及通過對象頭中的元數據指針定位到目標對象的類型信息。
  • 二、Java代碼編譯和執行過程

    ①. 大部分的程序代碼轉換成物理機的目標代碼或虛擬機能執行的指令集之前,都需要經過下面圖中的各個步驟:

    ②. 什么是解釋器( Interpreter),什么是JIT編譯器?掌握

  • 解釋器:當Java虛擬機啟動時會根據預定義的規范對字節碼采用逐行解釋的方式執行,將每條字節碼文件中的內容“翻譯”為對應平臺的本地機器指令執行
  • JIT (Just In Time Compiler)編譯器(即時編譯器):就是虛擬機將源代碼直接編譯成和本地機器平臺相關的機器語言
  • ③. 為什么說Java是半編譯半解釋型語言? 如下圖要記住

  • JDK1.0時代,將Java語言定位為“解釋執行”還是比較準確的。再后來,Java也發展出可以直接生成本地代碼的編譯器
  • 現在JVM在執行Java代碼的時候,通常都會將解釋執行與編譯執行二者結合起來進行。
  • 三、機器碼、指令、匯編語言

    ①. 機器碼:各種用二進制編碼方式表示的指令,叫做機器指令碼。開始,人們就用它采編寫程序,這就是機器語言(0 | 1 組成的)

  • 機器語言雖然能夠被計算機理解和接受,但和人們的語言差別太大,不易被人們理解和記憶,并且用它編程容易出差錯
  • 用它編寫的程序一經輸入計算機,CPU直接讀取運行,因此和其他語言編的程序相比,執行速度最快
  • 機器指令與CPU緊密相關,所以不同種類的CPU所對應的機器指令也就不同。
  • ②. 指令就是把機器碼中特定的0和1序列,簡化成對應的指令(一般為英文簡寫,如mov,inc等),可讀性稍好
    (由于不同的硬件平臺,執行同一個操作,對應的機器碼可能不同,所以不同的硬件平臺的同一種指令(比如mov),對應的機器碼也可能不同)

    ③. 指令集

  • 不同的硬件平臺,各自支持的指令,是有差別的。因此每個平臺所支持的指令,稱之為對應平臺的指令集
  • 如常見的(x86指令集,對應的是x86架構的平臺 | ARM指令集,對應的是ARM架構的平臺 )
  • ④. 匯編語言

  • 在匯編語言中,用助記符(Mnemonics)代替機器指令的操作碼,用地址符號(Symbol)或標號(Label)代替指令或操作數的地址
  • 在不同的硬件平臺,匯編語言對應著不同的機器語言指令集,通過匯編過程轉換成機器指令(由于計算機只認識指令碼,所以用匯編語言編寫的程序還必須翻譯成機器指令碼,計算機才能識別和執行)
  • ⑤. 高級語言(如下圖需要記住)

  • 為了使計算機用戶編程序更容易些,后來就出現了各種高級計算機語言。高級語言比機器語言、匯編語言更接近人的語言
  • 當計算機執行高級語言編寫的程序時,仍然需要把程序解釋和編譯成機器的指令碼。完成這個過程的程序就叫做解釋程序或編譯程序
  • 四、解釋器 掌握

    ①.JVM設計者們的初衷僅僅只是單純地為了滿足Java程序實現跨平臺特性,因此避免采用靜態編譯的方式直接生成本地機器指令,從而誕生了實現解釋器在運行時采用逐行解釋字節碼執行程序的想法。

    ②. 解釋器真正意義上所承擔的角色就是一個運行時“翻譯者”,將字節碼文件中的內容“翻譯”為對應平臺的本地機器指令執行

    ③. 當一條字節碼指令被解釋執行完成后,接著再根據PC寄存器中記錄的下一條需要被執行的字節碼指令執行解釋操作

    ④. 在Java的發展歷史里,一共有兩套解釋執行器,即古老的字節碼解釋器、現在普遍使用的模板解釋器。

    ⑤. 現狀:(了解)

  • 由于解釋器在設計和實現上非常簡單,因此除了Java語言之外,還有許多高級語言同樣也是基于解釋器執行的,比如Python、Perl、Ruby等。但是在今天,基于解釋器執行已經淪落為低效的代名詞,并且時常被一些C/C+ +程序員所調侃
  • 為了解決這個問題,JVM平臺支持一種叫作即時編譯的技術。即時編譯的目的是避免函數被解釋執行,而是將整個函數體編譯成為機器碼,每次函數執行時,只執行編譯后的機器碼即可,這種方式可以使執行效率大幅度提升
  • 不過無論如何,基于解釋器的執行模式仍然為中間語言的發展做出了不可磨滅的貢獻
  • 五、JIT編譯器 掌握

    ①. HostSpot JVM的執行方式:當虛擬機啟動的時候,解釋器可以首先發揮作用,而不必等待即時編譯器全部編譯完成再執行,這樣可以省去許多不必要的編譯時間。并且隨著程序運行時間的推移,即時編譯器逐漸發揮作用,根據熱點探測功能,將有價值的字節碼編譯為本地機器指令,以換取更高的程序執行效率。

    ②. HotSpot VM 為何解釋器與JIT編譯器共存? ①是結論,②是解釋:


    ③. 目前HotSpot VM所采用的熱點探測方式是基于計數器的熱點探測(采用基于計數器的熱點探測,HotSpot VM將會為每一個 方法都建立2個不同類型的計數器,分別為方法調用計數器(Invocation Counter) 和回邊計數器(BackEdge Counter) )

  • 方法調用計數器用于統計方法的調用次數
  • 回邊計數器則用于統計循環體執行的循環次數
  • ④. 方法調用計數器

    ⑤. 回邊計數器

    ⑥. 熱度衰減

    六、HotSpot VM 可以設置程序執行方式

    ①. 缺省情況下HotSpot VM是采用解釋器與即時編譯器并存的架構,當然開發人員可以根據具體的應用場景,通過命令顯式地為Java虛擬機指定在運行時到底是完全采用解釋器執行,還是完全采用即時編譯器執行。如下所示:

    ②. -Xint: 完全采用解釋器模式執行程序;

    ③. -Xcomp: 完全采用即時編譯器模式執行程序。如果即時編譯出現問題,解釋器會介入執行

    ④. -Xmixed:采用解釋器+即時編譯器的混合模式共同執行程序。

    七、HotSpot VM 中的JIT分類

    ①. 在HotSpot VM中內嵌有兩個JIT編譯器,分別為Client Compiler和Server
    Compiler,但大多數情況下我們簡稱為C1編譯器和C2編譯器。開發人員可以通過如下命.令顯式指定Java虛擬機在運行時到底使用哪一種即時編譯器,如下所示:
    ![在這里插入圖片描述](https://img-blog.csdnimg.cn/20210413111300848.png

    ②. 分層編譯(Tiered Compilation)策略:程序解釋執行(不開啟性能監控)可以觸發C1編譯,將字節碼編譯成機器碼,可以進行簡單優化,也可以加上性能監控,C2編譯會根據性能監控信息進行激進優化。

    ③. 總結:

  • 一般來講,JIT編譯出來的機器碼性能比解釋器高。
  • C2編譯器啟動時長比C1編譯器慢,系統穩定執行以后,C2編譯器執行速度遠遠快于C1編譯器。
  • 八、Graal編譯器與AOT編譯器

    ①. Graal編譯器

    ②. AOT編譯器(靜態提前編譯器)

    總結

    以上是生活随笔為你收集整理的JVM_05 执行引擎(Execution Engine)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。