JVM_05 执行引擎(Execution Engine)
總結(jié)寫在最前面:
一、 執(zhí)行引擎概述
①. 執(zhí)行引擎是Java虛擬機(jī)的核心組成部分之一
②. JVM的主要任務(wù)是負(fù)責(zé)裝載字節(jié)碼到其內(nèi)部,但字節(jié)碼并不能夠直接運(yùn)行在操作系統(tǒng)之上,因?yàn)樽止?jié)碼指令并非等價于本地機(jī)器指令,它內(nèi)部包含的僅僅只是一些能夠被JVM鎖識別的字節(jié)碼指令、符號表和其他輔助信息
③. 那么,如果想讓一個Java程序運(yùn)行起來、執(zhí)行引擎的任務(wù)就是將字節(jié)碼指令解釋/編譯為對應(yīng)平臺上的本地機(jī)器指令才可以。簡單來說,JVM中的執(zhí)行引擎充當(dāng)了將高級語言翻譯為機(jī)器語言的譯者
④. 執(zhí)行引擎的工作過程 (從外觀上來看,所有的Java虛擬機(jī)的執(zhí)行引擎輸入、輸出都是一致的:輸入的是字節(jié)碼二進(jìn)制流,處理過程是字節(jié)碼解析執(zhí)行的等效過程,輸出的是執(zhí)行結(jié)果)
二、Java代碼編譯和執(zhí)行過程
①. 大部分的程序代碼轉(zhuǎn)換成物理機(jī)的目標(biāo)代碼或虛擬機(jī)能執(zhí)行的指令集之前,都需要經(jīng)過下面圖中的各個步驟:
②. 什么是解釋器( Interpreter),什么是JIT編譯器?掌握
③. 為什么說Java是半編譯半解釋型語言? 如下圖要記住
三、機(jī)器碼、指令、匯編語言
①. 機(jī)器碼:各種用二進(jìn)制編碼方式表示的指令,叫做機(jī)器指令碼。開始,人們就用它采編寫程序,這就是機(jī)器語言(0 | 1 組成的)
②. 指令就是把機(jī)器碼中特定的0和1序列,簡化成對應(yīng)的指令(一般為英文簡寫,如mov,inc等),可讀性稍好
(由于不同的硬件平臺,執(zhí)行同一個操作,對應(yīng)的機(jī)器碼可能不同,所以不同的硬件平臺的同一種指令(比如mov),對應(yīng)的機(jī)器碼也可能不同)
③. 指令集
④. 匯編語言
⑤. 高級語言(如下圖需要記住)
四、解釋器 掌握
①.JVM設(shè)計(jì)者們的初衷僅僅只是單純地為了滿足Java程序?qū)崿F(xiàn)跨平臺特性,因此避免采用靜態(tài)編譯的方式直接生成本地機(jī)器指令,從而誕生了實(shí)現(xiàn)解釋器在運(yùn)行時采用逐行解釋字節(jié)碼執(zhí)行程序的想法。
②. 解釋器真正意義上所承擔(dān)的角色就是一個運(yùn)行時“翻譯者”,將字節(jié)碼文件中的內(nèi)容“翻譯”為對應(yīng)平臺的本地機(jī)器指令執(zhí)行
③. 當(dāng)一條字節(jié)碼指令被解釋執(zhí)行完成后,接著再根據(jù)PC寄存器中記錄的下一條需要被執(zhí)行的字節(jié)碼指令執(zhí)行解釋操作
④. 在Java的發(fā)展歷史里,一共有兩套解釋執(zhí)行器,即古老的字節(jié)碼解釋器、現(xiàn)在普遍使用的模板解釋器。
⑤. 現(xiàn)狀:(了解)
五、JIT編譯器 掌握
①. HostSpot JVM的執(zhí)行方式:當(dāng)虛擬機(jī)啟動的時候,解釋器可以首先發(fā)揮作用,而不必等待即時編譯器全部編譯完成再執(zhí)行,這樣可以省去許多不必要的編譯時間。并且隨著程序運(yùn)行時間的推移,即時編譯器逐漸發(fā)揮作用,根據(jù)熱點(diǎn)探測功能,將有價值的字節(jié)碼編譯為本地機(jī)器指令,以換取更高的程序執(zhí)行效率。
②. HotSpot VM 為何解釋器與JIT編譯器共存? ①是結(jié)論,②是解釋:
③. 目前HotSpot VM所采用的熱點(diǎn)探測方式是基于計(jì)數(shù)器的熱點(diǎn)探測(采用基于計(jì)數(shù)器的熱點(diǎn)探測,HotSpot VM將會為每一個 方法都建立2個不同類型的計(jì)數(shù)器,分別為方法調(diào)用計(jì)數(shù)器(Invocation Counter) 和回邊計(jì)數(shù)器(BackEdge Counter) )
④. 方法調(diào)用計(jì)數(shù)器
⑤. 回邊計(jì)數(shù)器
⑥. 熱度衰減
六、HotSpot VM 可以設(shè)置程序執(zhí)行方式
①. 缺省情況下HotSpot VM是采用解釋器與即時編譯器并存的架構(gòu),當(dāng)然開發(fā)人員可以根據(jù)具體的應(yīng)用場景,通過命令顯式地為Java虛擬機(jī)指定在運(yùn)行時到底是完全采用解釋器執(zhí)行,還是完全采用即時編譯器執(zhí)行。如下所示:
②. -Xint: 完全采用解釋器模式執(zhí)行程序;
③. -Xcomp: 完全采用即時編譯器模式執(zhí)行程序。如果即時編譯出現(xiàn)問題,解釋器會介入執(zhí)行
④. -Xmixed:采用解釋器+即時編譯器的混合模式共同執(zhí)行程序。
七、HotSpot VM 中的JIT分類
①. 在HotSpot VM中內(nèi)嵌有兩個JIT編譯器,分別為Client Compiler和Server
Compiler,但大多數(shù)情況下我們簡稱為C1編譯器和C2編譯器。開發(fā)人員可以通過如下命.令顯式指定Java虛擬機(jī)在運(yùn)行時到底使用哪一種即時編譯器,如下所示:
策略:程序解釋執(zhí)行(不開啟性能監(jiān)控)可以觸發(fā)C1編譯,將字節(jié)碼編譯成機(jī)器碼,可以進(jìn)行簡單優(yōu)化,也可以加上性能監(jiān)控,C2編譯會根據(jù)性能監(jiān)控信息進(jìn)行激進(jìn)優(yōu)化。
③. 總結(jié):
八、Graal編譯器與AOT編譯器
①. Graal編譯器
②. AOT編譯器(靜態(tài)提前編譯器)
總結(jié)
以上是生活随笔為你收集整理的JVM_05 执行引擎(Execution Engine)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022零售行业消费趋势新主张
- 下一篇: JVM_06 垃圾回收相关算法 [ 一