999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

HotSpot虛擬機類加載及優(yōu)化的原理與實現(xiàn)

2014-12-24 08:37:40郭書超
山東工業(yè)技術(shù) 2014年21期
關(guān)鍵詞:優(yōu)化方法

郭書超

(九江學(xué)院電子工程學(xué)院,江西 九江 332005)

1 引言

即時編譯器編譯性能的好壞及代碼優(yōu)化程度的高低作為衡量商用java虛擬機的關(guān)鍵技術(shù)指標(biāo),同時也是虛擬機技術(shù)水平的最好體現(xiàn)。由于java虛擬機規(guī)范知識規(guī)定了字節(jié)碼指令的動作,但并沒有規(guī)定虛擬機的實現(xiàn)方式。執(zhí)行引擎的核心動作就是不停讀取字節(jié)碼,解釋(編譯)執(zhí)行,直到虛擬機進程的退出為止。Sun HotSpot虛擬機執(zhí)行引擎為解釋器與編譯器共存的架構(gòu)方式,內(nèi)部的編譯器是即時編譯器主要由Client Compiler和Server Compiler構(gòu)成,解釋器與其中的一種構(gòu)成混合模式的虛擬機執(zhí)行引擎。

HotSpot的執(zhí)行引擎采用解釋器和即時編譯器共存的架構(gòu),對于一般的代碼采用解釋器每次讀取字節(jié)碼指令,將指令解釋乘本地代碼并予以執(zhí)行。這樣機制能夠有效節(jié)約內(nèi)存,減少編譯時間,讓代碼更加快速的進入執(zhí)行狀態(tài),但是存在代碼執(zhí)行效率低的缺點。即時編譯器采用熱點代碼偵測技術(shù),實時把熱點代碼編譯成本地代碼,調(diào)用的時候優(yōu)先使用本地編譯過的代碼,可以大大提高虛擬機的運行速度。另外不同的編譯器,還能有效實現(xiàn)局部或全局的代碼的優(yōu)化,有效提高字節(jié)碼的解釋效率,節(jié)約程序的調(diào)用時間。

2 HotSpot中的JIT的實現(xiàn)原理

從java虛擬機角度觀察,hotspot中類的加載分兩種情況:一種是啟動類加載器的加載器,由CPP代碼實現(xiàn);另外一種就是加載其他類的加載器。以下代碼分析的都是在目錄:/openjdk/hotspot/src/share/vm下,以下出現(xiàn)的目錄都位于該目錄之下。由于最開始java環(huán)境還沒有,通過CPP代碼構(gòu)建編譯的環(huán)境:

首先:hotspot啟動時,根據(jù)運行環(huán)境的不同,決定使用的寄存器、指令集及緩存大小等,判斷CPU架構(gòu)類型,在sparc、x86、x86-64或arm等結(jié)構(gòu)中選擇,根據(jù)架構(gòu)的不同加載不同的文件。

然后:進行加載過程的第一步—驗證:

(1)格式的驗證,主要驗證文件的魔數(shù)是否正確、主次版本號是否合理、常量池中的常量內(nèi)類是否合法、常量的索引是否符合、結(jié)構(gòu)是否符合UTF8編碼等。此時,如果常量池中的還有內(nèi)容沒有加載,便進行常量池的清理就會出現(xiàn)錯誤。

(2)元數(shù)據(jù)驗證,主要是對字節(jié)碼描述信息的語義進行分析,使得符合java語言的規(guī)范,主要包括類是否有繼承,繼承的父類是否能夠被繼承,該類是否為抽象類,類中的字段是否與父類的沖突等。

(3)字節(jié)碼驗證,主要是驗證數(shù)據(jù)流和控制零分析,保證程序語義的正確,邏輯合理,實現(xiàn)虛擬機的安全運行。

(4)符號引用的驗證,主要是解析階段進行,對類的匹配信息驗證。驗證階段也是非常重要的,若出現(xiàn)錯誤,根據(jù)不同的時段,會拋出不同的異常。

接著:使用類加載器實現(xiàn)類的加載,類加載器通過類的全限定名將描述該類的二進制字節(jié)流放置到j(luò)ava虛擬機。類加載器的和類本身都需要在虛擬機中是唯一存在的,每個加載器擁有自己的類命名空間。類加載過程中,如果發(fā)現(xiàn)制定的包已經(jīng)被虛擬機加載,就根據(jù)加載信息直接使用加載過的包,同時對類調(diào)用的計數(shù)器值加1。同樣的類加載器,結(jié)合不同的類加載,同樣可以在虛擬機中存在,通過哈希算法,被標(biāo)識成不同的值。類加載過程中主要是采用雙親委派模型,通過啟動類加載器、擴展類加載器、應(yīng)用程序加載器的共同配合進行加載。這種加載模式中,假設(shè)除了最頂層的類加載器外,其他的類都有父類加載器。在收到類加載請求之后,并不直接進行類的加載,將類加載的任務(wù)委派給父類加載器完成,由于每個類都是這樣進行,所有的類加載請求都會被提交到Objcet的類加載,只有當(dāng)父類無法加載時,子類才嘗試自己加載類。

然后:虛擬機的運行。HotSpot虛擬機和主流的商用虛擬機一樣都是采用解釋器與編譯器共存的架構(gòu)。這種架構(gòu)的優(yōu)勢體現(xiàn)在以下三個方面:

(1)在類剛加載時,首先工作在第0級,通過編譯策略決定java方法的編譯等級。此時主要由解釋器對類解釋執(zhí)行,實現(xiàn)節(jié)約編譯時間,達到立即執(zhí)行的目標(biāo)。隨著類運行時間的累計,越來越多的代碼都會被標(biāo)記為熱點代碼,經(jīng)編譯器編譯成本地代碼,實現(xiàn)執(zhí)行效率的提高。

(2)在代碼提交編譯到編譯成功投入運行的時段中,代碼的執(zhí)行依舊靠解釋器予以解釋執(zhí)行。

(3)在代碼優(yōu)化過程中,若是出現(xiàn)了優(yōu)化失敗的情況時,可以通過逆優(yōu)化實現(xiàn)“代碼逃逸”,解釋器在此過程中充當(dāng)著“逃逸門”的作用。在HotSpot虛擬機中使用不同的參數(shù)控制使用不同的即時編譯器,將解釋器和選定的即時編譯器搭配使用是其工作的常態(tài),使用“-Xint”參數(shù)實現(xiàn)虛擬機在解釋模式下運行,老版本虛擬機可以通過參數(shù)“-Xcomp”強迫運行在編譯方式中。

為了平衡程序啟動的速度和運行效率,虛擬機采用了分層編譯的手段達到兩種編譯器共同參與編譯的目標(biāo)。分層編譯的核心是編譯隊列的應(yīng)用,對與隊列中的每個方法,JVM計算時間時間的發(fā)生率,每次出隊的都是發(fā)生率最大的元素,使得過時的方法很快就可以刪除掉。在解釋器解釋執(zhí)行代碼時,當(dāng)虛擬機偵測到某個方法或代碼塊(主要是循環(huán))執(zhí)行非常頻繁時,頻繁程度主要采用基于采樣的熱點探測和基于計數(shù)器的熱點探測兩種方法來裁決,前者實現(xiàn)簡單,容易受到外界影響,使用場合不多;后者結(jié)果更加準(zhǔn)確,通過方法調(diào)用計數(shù)器和回邊計數(shù)器的共同配合,實現(xiàn)熱點代碼的探測。

經(jīng)過熱點代碼的認(rèn)定之后,熱點代碼被調(diào)用時,虛擬機就會檢查是否有被JIT編譯的版本,存在就會優(yōu)先使用編譯后的代碼運行;否則將方法調(diào)用計數(shù)器或回邊計數(shù)器加上1,判斷方法調(diào)用計數(shù)器和回邊計數(shù)器的和是否超過計數(shù)器設(shè)定的閾值,如果超過閾值,就向即時編譯器提交該方法的代碼編譯請求,在等待編譯的時段內(nèi)的代碼繼續(xù)以解釋的方式執(zhí)行。引入熱點代碼是為了提高熱點代碼的執(zhí)行效率,運行時,虛擬機會將這些代碼編譯成與平臺相關(guān)的機器碼,將抽象的IR(中間表示)、CFG(控制流圖)和SSA(靜態(tài)單賦值)轉(zhuǎn)變?yōu)榫唧w的寄存器、編譯目標(biāo)內(nèi)容,達到縮短編譯時間實現(xiàn)代碼優(yōu)化的目標(biāo)。

3 編譯過程

經(jīng)過前期的準(zhǔn)備工作,編譯器選擇java方法或循環(huán)體作為編譯的目標(biāo)。編譯方法時,首先創(chuàng)建一個Compilation類,該類中的方法compile_mothod()被用來執(zhí)行編譯的過程,具體代碼c1c1_compiler.cpp。明確將編譯過程分成多個中間環(huán)節(jié),甚至能夠通過VM選項,得到非常詳細(xì)的編譯細(xì)節(jié)。打開VM選項后,可以得到CFG文件,該文件描述了編譯的各個環(huán)節(jié)。

(1)生成HIR環(huán)節(jié),HIR相當(dāng)于基本塊組成的控制流圖。

(2)生成LIR環(huán)節(jié),該環(huán)節(jié)中,編譯器生成了寄存器分配前的LIR代碼,相對與HIR環(huán)節(jié),此處增加了LIR指令信息,局部變量的狀態(tài)也發(fā)生了變化,變量名分配了虛擬寄存器。該處的寄存器是LIR格式的虛擬寄存器,明確了機器指令,甚至包括指令名稱與尋址方式,通過分配物理寄存器明確實際地址即可。

(3)寄存器分配中為了充分利用寄存器資源,盡可能將程序變量盡量分配到寄存器中,達到提高執(zhí)行速度的目標(biāo)。如何將數(shù)據(jù)盡量長時間的保存在寄存器中,并將廢棄的數(shù)據(jù)盡快清除是一個必須解決的問題。HotSpot使用了線性掃描算法,該算法的核心是:對任意兩個變量的生命區(qū)間存在著重疊區(qū)域,不能將同一物理寄存器分配給這兩個變量。HashSet.add()方法完成寄存器的分配任務(wù)。最后生成優(yōu)化后的字節(jié)碼。

經(jīng)過經(jīng)典優(yōu)化如無用代碼消除、循環(huán)展開、循環(huán)表達式外提、消除公共子表達式、塊重排、常量傳播等優(yōu)化后的代碼性能幾乎可以達到GNU C++編譯器的-O2參數(shù)的優(yōu)化強度,說明基于熱點探測的即時觸發(fā)技術(shù)還是非常有效的優(yōu)化手段。

4 結(jié)束語

本文通過研究HotSpot虛擬機類加載及優(yōu)化的原理與代碼實現(xiàn),在深刻理解其工作原理基礎(chǔ)上,加上對HotSpot代碼的閱讀,為自己理解虛擬機的工作原理與將來實現(xiàn)虛擬機打下良好的基礎(chǔ)。

[1]陳濤著.HotSpot實戰(zhàn) [M].人民郵電出版社,2014(03).

[2]周志明著.深入理解Java虛擬機-JVM高級特性與最佳實踐 [M].機械工業(yè)出版社,2014(04).

[3]Tim Lindholm、 Frank Yellin、Gilad Bracha、Alex Buckley著,周志明,薛笛,吳璞淵,冶秀剛 譯 Java虛擬機規(guī)范(Java SE 7版)[M].機械工業(yè)出版社,2014(01).

猜你喜歡
優(yōu)化方法
超限高層建筑結(jié)構(gòu)設(shè)計與優(yōu)化思考
民用建筑防煙排煙設(shè)計優(yōu)化探討
關(guān)于優(yōu)化消防安全告知承諾的一些思考
一道優(yōu)化題的幾何解法
由“形”啟“數(shù)”優(yōu)化運算——以2021年解析幾何高考題為例
學(xué)習(xí)方法
用對方法才能瘦
Coco薇(2016年2期)2016-03-22 02:42:52
四大方法 教你不再“坐以待病”!
Coco薇(2015年1期)2015-08-13 02:47:34
賺錢方法
捕魚
主站蜘蛛池模板: 69av在线| 免费高清毛片| 日本黄色不卡视频| 欧美在线黄| 亚洲精品片911| 国产玖玖视频| 国产麻豆va精品视频| 国产真实二区一区在线亚洲| 99精品视频播放| 欧美日韩午夜| 国产精品99r8在线观看| 久热re国产手机在线观看| 亚洲区一区| 欧美日本不卡| www.99在线观看| 久久国产精品嫖妓| AV不卡无码免费一区二区三区| 国产成人精品在线1区| 亚洲无码在线午夜电影| 精品三级网站| 久久国产精品影院| 香蕉久人久人青草青草| 欧美色图久久| 欧美啪啪网| www.亚洲一区| 国产午夜小视频| 国产成人精品日本亚洲77美色| 国产美女叼嘿视频免费看| 久久久久人妻一区精品| 国产无码制服丝袜| 97国内精品久久久久不卡| 在线国产欧美| 欧洲精品视频在线观看| 欧美精品一区在线看| 91成人在线观看视频| 成人免费视频一区| 怡春院欧美一区二区三区免费| 无码免费的亚洲视频| 成人伊人色一区二区三区| 日韩无码真实干出血视频| 欧美在线黄| 手机在线免费毛片| 黄色一级视频欧美| 99久久人妻精品免费二区| 欧美精品xx| 国产乱人免费视频| 精品91自产拍在线| 麻豆a级片| 无码高清专区| 免费看美女自慰的网站| 国产91特黄特色A级毛片| 精品国产中文一级毛片在线看| 婷婷六月天激情| 欧洲高清无码在线| 91精品国产情侣高潮露脸| 亚洲视频二| 91po国产在线精品免费观看| 久久99国产综合精品女同| 在线看AV天堂| 国产理论精品| 激情乱人伦| 人禽伦免费交视频网页播放| 国产精品区视频中文字幕| 免费国产福利| 久久久久亚洲av成人网人人软件| 国产浮力第一页永久地址 | 久久精品亚洲热综合一区二区| 无码在线激情片| 亚洲av片在线免费观看| 国产99在线观看| 成·人免费午夜无码视频在线观看 | 少妇露出福利视频| 国产中文在线亚洲精品官网| 久久中文电影| 国产人成网线在线播放va| 精品撒尿视频一区二区三区| 国产精品极品美女自在线网站| 成人免费视频一区二区三区 | 一级看片免费视频| 精品精品国产高清A毛片| 国产乱子伦精品视频| 亚洲a级毛片|