成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深入分析JVM執(zhí)行引擎

開發(fā) 前端
執(zhí)行引擎的作用就是將字節(jié)碼指令解釋或者編譯為對應平臺上的本地機器指令。簡單來說,執(zhí)行引擎充當了將高級語言翻譯為機器語言的翻譯者。對于Hotspot虛擬機,執(zhí)行引擎中包含兩部分:解釋器和JIT編譯器(即時編譯器)。

一、閑聊

相信很多朋友在出國旅游,或者與外國友人溝通的過程中,都會遇到語言不通的煩惱。這時候我們就需要掌握對應的外語或者擁有一部翻譯機。而筆者只會中文,所以需要借助一部翻譯器才能與不懂中文的外國友人交流。咱們的執(zhí)行引擎就類似于這部“翻譯機”。

二、概述

執(zhí)行引擎的作用就是將字節(jié)碼指令解釋或者編譯為對應平臺上的本地機器指令。簡單來說,執(zhí)行引擎充當了將高級語言翻譯為機器語言的翻譯者。對于Hotspot虛擬機,執(zhí)行引擎中包含兩部分:解釋器和JIT編譯器(即時編譯器)。下圖是執(zhí)行引擎的原理: 

圖片

三、解釋器

解釋器所承擔的角色就是一個運行時翻譯者?,將字節(jié)碼文件中的內容翻譯?為對應平臺的本地機器碼指令。當一條字節(jié)碼指令被解釋執(zhí)行后,接著再根據(jù)pc寄存器中記錄的下一條需要被執(zhí)行的字節(jié)碼指令執(zhí)行解釋操作。JVM解釋器一共有兩套,一套是遠古的字節(jié)碼解釋器?,另一套是現(xiàn)在普遍使用的模板解釋器。

1、字節(jié)碼解釋器

字節(jié)碼解釋器在執(zhí)行過程中通過純軟件代碼模擬字節(jié)碼執(zhí)行,效率非常低。

2、模板解釋器

模板解釋器將每一條字節(jié)碼和一個模板函數(shù)關聯(lián),模板函數(shù)中直接產(chǎn)生這條字節(jié)碼指令執(zhí)行時的機器碼,從而提高了解釋器的性能。在常用的HotSpot VM中,解釋器主要由Interpreter模板和code模塊構成。Interpreter模板:實現(xiàn)了解釋器的核心功能。code模塊:用于管理HotSpot VM在運行時生成的本地機器碼指令。

四、即時編譯器(JIT編譯器)

即時編譯器的目的是避免函數(shù)被解釋執(zhí)行,而是將整個函數(shù)體編譯成機器碼指令,每次函數(shù)執(zhí)行時,只執(zhí)行編譯后的機器碼即可,這種方式可以大大的提高效率。

1、熱點代碼及探測方式

當然,是否需要JIT編譯器將字節(jié)碼直接編譯成對應平臺的機器碼,需要根據(jù)代碼被調用的執(zhí)行頻率?而定。需要被JIT編譯器編譯成機器碼的字節(jié)碼,也稱為熱點代碼?,JIT編譯器會對熱點代碼做出深度優(yōu)化?,將其從字節(jié)碼編譯成機器碼,并緩存到方法區(qū)?,提高代碼的執(zhí)行效率。JIT編譯的方式發(fā)生在方法執(zhí)行過程中,因此也被稱之為_棧上替換_,或簡稱OSR(On Stack Replacement)編譯。通過熱點探測的方法,判斷一個方法被調用多少次,或循環(huán)體執(zhí)行多少次才可以達到閾值,進行編譯。而Hotspot VM熱點探測的方式是基于計數(shù)器實現(xiàn)的。這種基于技術的熱點探測方式又分為兩種:1.方法調用計數(shù)器 2.回邊計數(shù)器

關于棧上替換這里筆者不展開贅述,有興趣的小伙伴可以自行了解下

1.1方法調用計數(shù)器

方法調用計數(shù)器用于統(tǒng)計方法調用次數(shù),它的默認閾值是client模式下是1500次,在server模式下是10000次。超過這個閾值,就會觸發(fā)JIT編譯。當然,這個閾值也可以通過修改虛擬機參數(shù)-XX:CompileThreshold來手動指定。當一個方法被調用的時候,會優(yōu)先檢查該方法是否被JIT編譯過,如果存在,則優(yōu)先使用編譯過的本地代碼來執(zhí)行,如果不存在,則將此方法的調用計數(shù)器加一,然后再判斷計數(shù)器的值是否超過配置的閾值。如果已經(jīng)超過了,就會向JIT編譯器提交一個該方法的編譯請求。下面是方法調用計數(shù)器執(zhí)行的流程圖: 

圖片

 

關于方法調用計數(shù)器,如果不做任何設置,方法調用計數(shù)器統(tǒng)計的并不是方法被調用的絕對次數(shù),而是一個相對執(zhí)行的頻率。當超過一定的時間限度,如果方法的調用次數(shù)仍然達不到閾值,那這個方法的調用計數(shù)器就會被減少一半,這個過程稱為方法調用計數(shù)器的熱度衰減?,而這段時間被稱作為該方法的半衰周期?。進行熱度衰減的過程是虛擬機進行垃圾回收的時候順便進行的,舉手之勞而已。可以使用虛擬機參數(shù)-XX:-UseCounterDecay?來關閉熱度衰減。這樣的話,只要運行時間足夠長,絕大部分方法都會被編譯成本地代碼。最后,還可以使用-XX:CounterHalfLifeTime參數(shù)設置半衰周期的時間,單位為秒。

1.2回邊計數(shù)器

它的作用是統(tǒng)計一個方法中循環(huán)體代碼執(zhí)行次數(shù),在字節(jié)碼中遇到控制流向后,跳轉的指令稱為“回邊”。顯然,建立回邊計數(shù)器統(tǒng)計的目的是為了觸發(fā)OSR編譯。下面是回邊計數(shù)器執(zhí)行的流程圖:

關于OSR編譯上文中有提到

圖片

2、即時編譯器分類

在Hotspot VM中,內嵌有兩個JIT編譯器,分別為client compiler和server compiler,但是大多數(shù)情況下我們簡稱C1編譯器和C2編譯器。可以通過命令顯示的指定JVM在運行時到底使用哪種JIT編譯器。

2.1 c1編譯器

指定Java虛擬機運行在client模式下,使用C1編譯器。C1編譯器會對字節(jié)碼進行簡單和可靠的優(yōu)化,耗時短。以達到更快的編譯速度,但是編譯后的代碼執(zhí)行速度相對慢。C1編譯器主要有方法內聯(lián),去虛擬化,冗余消除。

方法內聯(lián):將引用的函數(shù)代碼編譯到引用點處,這樣可以減少棧幀的生成,減少參數(shù)傳遞以及跳轉過程。

去虛擬化:對唯一實現(xiàn)的類進行內聯(lián)。

冗余消除:在運行期間把一些不會執(zhí)行的代碼疊掉。

2.2 c2編譯器

指定Java虛擬機運行在server模式下,使用C2編譯器。C2編譯器對代碼優(yōu)化時間長,編譯時間也長。但是編譯后的代碼執(zhí)行速度比較快。C2的優(yōu)化主要在全局層面,逃逸分析是優(yōu)化的基礎。基于逃逸分析,C2上有如下幾種優(yōu)化:

標量替換:用標量值代替聚合對象的屬性值。

棧上分配:對于未逃逸的對象分配在棧上而不是堆上。

同步消除:清除同步操作,通常指synchronized。

2.3 Graal編譯器

JDK10起,在C1編譯器和C2編譯器之后,HotSpot VM新增了一個Graal即時編譯器。編譯效果短短幾年的時間就追平了C2編譯器。目前,帶著“實驗狀態(tài)”標簽,需要使用開關參數(shù)-XX:+UnlockExperimentalVMOptions,-XX:+UseJVMCICompiler去激活這個編譯器,才能使用。

五、解釋器和JIT并存

為什么需要解釋器和JIT并存,原因有幾點:

當程序啟動的時候,解釋器可以馬上發(fā)揮作用,省去編譯的時間。

編譯器想要執(zhí)行,需要把字節(jié)碼編譯成本地機器碼,并且緩存編譯后的機器碼,編譯需要一定的時間。

編譯后的本地機器碼,執(zhí)行效率高。所以,在兩種并存的模式下,解釋器首先發(fā)揮作用,而不必等到即時編譯器全部編譯完再執(zhí)行,這樣可以省去不必要的編譯時間。

隨著程序繼續(xù)不斷運行,編譯器發(fā)揮作用,根據(jù)熱點探測功能,把越來越多的字節(jié)碼編譯成本地機器碼,獲得更高的執(zhí)行效率。

六、執(zhí)行引擎執(zhí)行程序的方式

在默認的情況下,HotSpot VM采用的是解釋器和JIT編譯器并存的架構,當然讀者可以根據(jù)具體的應用場景,通過虛擬機參數(shù),為虛擬機指定在運行時到底是完全采用解釋器執(zhí)行,還是完全采用即時編譯器執(zhí)行。

-Xint:完全采用解釋器模式執(zhí)行程序

-XComp:完全采用即時編譯器模式執(zhí)行程序。如果即時編譯器出現(xiàn)問題,解釋器會介入執(zhí)行;

-Xmixed:采用解釋器+即時編譯器的混合模式共同執(zhí)行程序,HotStop VM默認就是這個模式。

七、參考源碼

編程文檔:https://gitee.com/cicadasmile/butte-java-note

應用倉庫:https://gitee.com/cicadasmile/butte-flyer-parent

責任編輯:武曉燕 來源: 知了一笑
相關推薦

2011-03-23 11:01:55

LAMP 架構

2010-09-07 14:21:22

PPPoE協(xié)議

2022-04-12 08:30:45

TomcatWeb 應用Servlet

2009-12-16 16:39:01

Visual Stud

2009-06-10 18:12:38

Equinox動態(tài)化OSGi動態(tài)化

2009-12-14 14:50:46

Ruby傳參數(shù)

2021-10-29 16:36:53

AMSAndroidActivityMan

2023-02-01 08:13:30

Redis內存碎片

2011-09-01 13:51:52

JavaScript

2010-03-08 14:53:48

Linux分區(qū)

2009-07-03 11:14:57

2011-06-28 14:11:33

JavaScript

2014-10-30 15:08:21

快速排序編程算法

2009-04-13 16:37:33

JSPWeb標簽

2015-08-03 09:54:26

Java線程Java

2018-10-25 15:24:10

ThreadLocal內存泄漏Java

2018-12-18 10:11:37

軟件復雜度軟件系統(tǒng)軟件開發(fā)

2021-04-13 12:55:06

SpringMVC解析器接口

2023-08-07 07:44:44

2020-12-07 06:23:48

Java內存
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕亚洲国产 | 欧美黄色片| 欧美精品一区二区三区四区 在线 | 久久久婷 | 久久精选 | 免费观看成人鲁鲁鲁鲁鲁视频 | 精品国产免费人成在线观看 | 久久一区二区av | 91人人在线| 国产在线一区二区三区 | 成年人黄色免费视频 | 久久久亚洲一区 | 婷婷综合在线 | 欧美一级免费观看 | av官网在线 | 亚洲天堂网站 | 一级少妇女片 | 成人在线免费观看 | 国产成人精品免高潮在线观看 | 成人av在线播放 | 欧美精品成人影院 | 中文字幕亚洲视频 | 成人精品在线观看 | 亚洲在线观看视频 | 亚洲精品区 | 日韩精品视频网 | 97精品久久 | 亚洲精品电影网在线观看 | 亚洲不卡在线观看 | 色婷婷精品久久二区二区蜜臂av | 99精品免费久久久久久久久日本 | 亚洲欧美日韩精品久久亚洲区 | 日韩一区二区三区在线看 | 天天操网 | 国产精品毛片无码 | 国产精品美女久久久久久免费 | 91久久伊人 | 毛片毛片毛片毛片毛片 | 亚洲综合三区 | 欧美视频成人 | 视频一区二区在线观看 |