JVM_05 执行引擎(Execution Engine)
總結寫在最前面:
一、 執行引擎概述
①. 執行引擎是Java虛擬機的核心組成部分之一
②. JVM的主要任務是負責裝載字節碼到其內部,但字節碼并不能夠直接運行在操作系統之上,因為字節碼指令并非等價于本地機器指令,它內部包含的僅僅只是一些能夠被JVM鎖識別的字節碼指令、符號表和其他輔助信息
③. 那么,如果想讓一個Java程序運行起來、執行引擎的任務就是將字節碼指令解釋/編譯為對應平臺上的本地機器指令才可以。簡單來說,JVM中的執行引擎充當了將高級語言翻譯為機器語言的譯者
④. 執行引擎的工作過程 (從外觀上來看,所有的Java虛擬機的執行引擎輸入、輸出都是一致的:輸入的是字節碼二進制流,處理過程是字節碼解析執行的等效過程,輸出的是執行結果)
二、Java代碼編譯和執行過程
①. 大部分的程序代碼轉換成物理機的目標代碼或虛擬機能執行的指令集之前,都需要經過下面圖中的各個步驟:
②. 什么是解釋器( Interpreter),什么是JIT編譯器?掌握
③. 為什么說Java是半編譯半解釋型語言? 如下圖要記住
三、機器碼、指令、匯編語言
①. 機器碼:各種用二進制編碼方式表示的指令,叫做機器指令碼。開始,人們就用它采編寫程序,這就是機器語言(0 | 1 組成的)
②. 指令就是把機器碼中特定的0和1序列,簡化成對應的指令(一般為英文簡寫,如mov,inc等),可讀性稍好
(由于不同的硬件平臺,執行同一個操作,對應的機器碼可能不同,所以不同的硬件平臺的同一種指令(比如mov),對應的機器碼也可能不同)
③. 指令集
④. 匯編語言
⑤. 高級語言(如下圖需要記住)
四、解釋器 掌握
①.JVM設計者們的初衷僅僅只是單純地為了滿足Java程序實現跨平臺特性,因此避免采用靜態編譯的方式直接生成本地機器指令,從而誕生了實現解釋器在運行時采用逐行解釋字節碼執行程序的想法。
②. 解釋器真正意義上所承擔的角色就是一個運行時“翻譯者”,將字節碼文件中的內容“翻譯”為對應平臺的本地機器指令執行
③. 當一條字節碼指令被解釋執行完成后,接著再根據PC寄存器中記錄的下一條需要被執行的字節碼指令執行解釋操作
④. 在Java的發展歷史里,一共有兩套解釋執行器,即古老的字節碼解釋器、現在普遍使用的模板解釋器。
⑤. 現狀:(了解)
五、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虛擬機在運行時到底使用哪一種即時編譯器,如下所示:
策略:程序解釋執行(不開啟性能監控)可以觸發C1編譯,將字節碼編譯成機器碼,可以進行簡單優化,也可以加上性能監控,C2編譯會根據性能監控信息進行激進優化。
③. 總結:
八、Graal編譯器與AOT編譯器
①. Graal編譯器
②. AOT編譯器(靜態提前編譯器)
總結
以上是生活随笔為你收集整理的JVM_05 执行引擎(Execution Engine)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022零售行业消费趋势新主张
- 下一篇: JVM_06 垃圾回收相关算法 [ 一