亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇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í)行,直到虛擬機進(jìn)程的退出為止。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)存,減少編譯時間,讓代碼更加快速的進(jìn)入執(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)的不同加載不同的文件。

        然后:進(jìn)行加載過程的第一步—驗證:

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

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

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

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

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

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

        (1)在類剛加載時,首先工作在第0級,通過編譯策略決定java方法的編譯等級。此時主要由解釋器對類解釋執(zhí)行,實現(xiàn)節(jié)約編譯時間,達(dá)到立即執(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”強迫運行在編譯方式中。

        為了平衡程序啟動的速度和運行效率,虛擬機采用了分層編譯的手段達(dá)到兩種編譯器共同參與編譯的目標(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)容,達(dá)到縮短編譯時間實現(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)寄存器分配中為了充分利用寄存器資源,盡可能將程序變量盡量分配到寄存器中,達(dá)到提高執(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)表達(dá)式外提、消除公共子表達(dá)式、塊重排、常量傳播等優(yōu)化后的代碼性能幾乎可以達(dá)到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
        賺錢方法
        亚洲av美女在线播放啊| 国产在视频线精品视频二代| 精品久久久久久电影院| 亚洲国产日韩综一区二区在性色 | 成人黄色片久久久大全| 国产亚洲成人精品久久久| 一级做a爱视频在线播放| 国产女主播大秀在线观看 | 国产一区二区三区视频网| 欧美激情乱人伦| 亚洲乱码日产精品一二三| 亚洲av永久无码天堂网手机版| 国产主播福利一区二区| 亚洲国产福利成人一区二区 | 日产无人区一线二线三线新版| 亚洲AV毛片无码成人区httP| 亚洲性爱区免费视频一区| 日韩一级精品亚洲一区二区精品| av在线免费观看大全| 中国女人内谢69xxxxxa片| 久久无码av中文出轨人妻| 国产精品爽爽va在线观看无码| 久久青草国产精品一区| 亚洲一区二区视频蜜桃| 亚洲av在线观看播放| 国产亚州精品女人久久久久久| 精品亚洲成a人片在线观看| 无码专区天天躁天天躁在线| 99久久久无码国产精品动漫| 自拍偷拍一区二区三区四区| 久久日韩精品一区二区| 日本动漫瀑乳h动漫啪啪免费| 毛片大全真人在线| 九九99久久精品在免费线18| 亚洲精品在线观看一区二区 | 精品视频一区二区三区日本| 狠狠色综合7777久夜色撩人| 国产精品久久久久久人妻精品| 亚洲精品黄网在线观看| 亚洲天堂免费一二三四区| 丁香婷婷在线成人播放视频|