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

基于結構描述的HotSpot C2即時編譯器

2022-11-22 07:28:21鄭艷
中國新通信 2022年16期

摘要:OpenJDK的開源吸引了很多想弄明白Java虛擬機如何運行的開發人員。本文基于HotSpot虛擬機源碼,分析了Java虛擬機的運行機制,并進一步深入研究了服務器端C2即時編譯框架,指出了HotSpot虛擬機高效運行的原因,為下一步深入優化打好基礎。

關鍵詞: Java虛擬機;HotSpot虛擬機;服務器端編譯器;結構描述文件

一、引言

Java虛擬機技術提供Java標準平臺的基礎設施,提供對快速開發、部署關鍵業務的桌面和企業應用程序的解決方案。Java無處不在,而Java虛擬機正是支撐Java運行的秘密武器,它是一個在硬件平臺、操作系統之上的一個龐大復雜的軟件,涉及的理論和技術非常廣而寬。

HotSpot虛擬機是Sun/Oracle JDK和OpenJDK的默認Java虛擬機[1],是基于Java虛擬機規范[2]的一個高效虛擬機實現,也是全世界使用最廣泛、最具影響力的Java虛擬機。很多程序員默認HotSpot虛擬機等同于Java虛擬機。

二、HotSpot虛擬機

(二)執行架構

HotSpot虛擬機的執行架構示意圖如圖1所示[4-5]。

HotSpot虛擬機采用解釋器與編譯器并存的架構,解釋器和編譯器是相輔相成地配合工作的。解釋器和編譯器兩者各有優勢:當程序需要迅速啟動和執行的時候,解釋器可以省去編譯的時間,立即執行;當程序運行后,隨著時間的推移,編譯器逐漸發揮作用,把越來越多的代碼編譯成本地代碼之后,可以獲取更高的執行效率。在某些特定情況下編譯模式也能夠通過“逆優化”(deoptimization)退回到解釋模式下繼續執行。

(二)解釋編譯交互

同時存在解釋執行和編譯執行,涉及解釋執行和編譯執行互相轉化,圖2說明了解釋執行和編譯執行互相轉換的途徑[6]。

Java虛擬機中如果某個方法被編譯,則下次執行同樣的方法時切換為編譯執行。編譯執行的入口有2種情況:方法編譯和核心循環編譯。方法編譯在下次執行前要切換方法調用的入口,改寫成i2c adapter的首地址,這個adapter完成從解釋執行轉為編譯執行的功能;同時要完成把解釋執行的參數拷貝到編譯執行的參數區,解釋執行時,參數區直接位于棧中,對于編譯執行,參數一部分位于寄存器中,一部分位于棧中,所以,移植過程中需要考慮傳遞參數的這種情況。核心循環編譯是由循環體出發的,但編譯器依然會以整個方法作為編譯對象,執行的是棧上替換OSR算法,即在運行過程中直接用編譯執行的方法替換解釋執行的方法,而不是下次調用該方法時再做替換,OSR關鍵的是要復制解釋執行時產生的局部變量,同步鎖等。

編譯執行到解釋執行的也有2個入口,最普通的入口是編譯執行的方法調用解釋執行的方法;另一個入口叫逆(deoptimization)操作。在編譯執行的方法中進行方法調用時會查詢方法的入口地址,如果是靜態方法,直接解析方法入口地址,否則就將解析方法入口地址,這個函數會判斷被調用的方法是否已經被編譯過了,如果沒有被編譯過就進入編譯轉解釋執行的入口。逆優化則可能是在編譯執行方法時可能由于某種原因需要重新解釋執行。

三、C2即時編譯

服務器版編譯器是一個專門面向服務器典型應用的充分優化過的先進自適應編譯器,它支持和傳統編譯器如C++編譯器類似的許多編譯優化流程,以及一些傳統編譯器所不能做的自適應優化。

(一)編譯框架

C2即時編譯器通過目標處理器平臺的結構描述文件和指令匹配規則,提升優化效率,其結構圖如圖3所示:

編譯器首先分析字節碼并生成中間表示Ideal圖,所有優化和代碼產生都是基于它;接著進行平臺無關優化并生成平臺相關的MachNode圖;最后進行平臺相關優化,包括指令選擇、代碼重排、寄存器分配、窺孔優化,直至輸出目標機器代碼。

在指令匹配選擇階段,基于確定有限狀態機生成器(DFA)匹配最優的指令和操作數,通過指令的屬性,如指令的訪存代價、流水線結構等眾多屬性分析每種指令的優劣并作出最優匹配選擇,這些重要的屬性都是通過國產處理器的結構描述文件(Architecture Description File,AD文件)通過結構描述語言編譯器(ADL)編譯生成獲得;接著進行機器平臺相關的優化,如寄存器分配、窺孔優化等,直至最后生成熱方法的本地機器代碼,服務器版編譯器寄存器分配是一個全局圖著色分配器,它可以充分利用處理器的大寄存器集合。

(二)結構描述文件

結構描述文件(Architecture Description File,AD文件)的準確描述,對服務器版即時編譯器的移植工作非常關鍵,這是性能版虛擬機高性能的基礎。它描述目標處理器的結構,并通過專門的ADL編譯器將結構描述文件創建為JIT包含的結構相關優化源碼,以便JIT生成高效正確的本地代碼。

AD文件描述了三類基本的不同結構特征:目標平臺的指令集(包括操作數)、寄存器(以及寄存器分配相關信息)以及針對調度優化的目標平臺流水線結構信息,另外還有部分為了簡化描述而增加的一些輔助定義。

1. 寄存器描述

寄存器格式的定義如下:

“reg_def” name ( register save type, C convention save type,

ideal register type, encoding, vm name );

函數的各個參數意思明確,“save type”表示寄存器分配寄存器在方法調用之間的保留類型,有不保存、調用處保存、調用前保存及調用前和調用處都保存等四種類型;第三個參數“ideal register type”用來確定如何保留恢復一個寄存器,“encoding”是由于有寄存器擴展,用于表示放置在opcodes中實際的位數。

寄存器描述中還包括reg_class和alloc_class,如整形寄存器、浮點寄存器、特殊寄存器(如標志寄存器)以及定義具有相同屬性的寄存器類等,它們整個是為指令選擇和寄存器分配提供信息,所有寄存器均是用戶可見或普通指令涉及的寄存器,不包括特權或處理器內部寄存器。

2. 指令集描述

指令集在結構描述文件中的工作占著很大比重,一是由于申威平臺指令較多,每條指令都需要描述;另一個是還需要描述操作碼、操作數屬性、考慮如何與中間表示匹配、匯編輸出格式以及硬件執行上屬于什么流水分類等。

下面我們以下兩個具體實例來說明這些屬性設置的含義:

實例1:

1. Instruct addI_reg_reg(iRegI dst, iRegI src1, iRegI src2) %{

2. match(Set dst (AddI src1 src2));

3.

4.? size(4);

5. Format %{ “ADD? ? $src1,$src2,$dst” %}

6. ins_encode %{

7.? ? __ add($src1$$Register, $src2$$Register, $dst$$Register);

8.? %}

9.? ins_pipe(ialu_reg_reg);

10. %}

實例2:

1. Instruct addI_reg_imm13(iRegI dst, iRegI src1, immI13 src2) %{

2. match(Set dst (AddI src1 src2));

3.

4.? size(4);

5.? Format %{ “ADD? ? $src1,$src2,$dst” %}

6.? opcode(Assembler::add_op3, Assembler::arith_op);

7.? ins_encode( form3_rs1_simm13_rd(src1, src2, dst) );

8.? ins_pipe(ialu_reg_imm);

9.? %}

instruct:指定機器指令的入口。實例中說明長字加指令的入口,前一個是指操作數都為寄存器時addl指令的入口,后面的指操作數一是寄存器一是13位立即數時addl指令的入口。

match:指定指令的中間表示匹配規則。

size:指令默認長度,申威處理器指令長度均為32位。

encode:指定指令的編碼規則。在instruct定義中,有兩種方式生成本地機器碼,一種是通過ins_encode語句塊直接指定指令序列;另一種是通過opcode和ins_encode配合完成,opcode指定指令的操作碼(包括主操作碼和輔助操作碼),ins_encode指定指令的其他部分如何編碼,這是通過enc_class來完成。

enc_class定義了若干指令編碼類供instruct使用,通過這種方式,可把編碼規則相同的指令用一個enc_class代替,這樣可有效降低instruct定義的工作量且可降低出錯概率。

ins_pipe:指定當前指令使用哪些pipe_class。這在處理器流水線的特征里進行了描述,包括指令長度、是否有延遲槽等的屬性描述、指令執行部件資源描述和不同類型的操作涉及了流水線的哪些階段的流水分類描述等。

format:匯編指令的輸出格式。若為多條指令,應一起輸出。

指令描述的其他信息描述也都比較簡單,從文檔中能夠明顯看出,這里不作詳述。指令集定義完成被ADL編譯器生成后,在指令選擇階段利用一個DFA來選擇匹配最優的操作數和指令。

3. 流水線結構

結構描述文件還定義了處理器流水線的特征,它描述了指令執行在硬件流水線上的特征。該部分描述涉及四部分:

屬性(attributes):定義了指令長度、是否有延遲槽等。

資源(resources):定義指令執行的功能部件。

流水線描述(pipe_desc):定義流水線站臺。

流水線分類(pipe_class):定義不同類型的操作涉及了流水線的哪些階段,,在指令集描述中的ins_pipe就是用于指定指令屬于哪個流水線分類。

(三)指令匹配

在解析Java字節碼并生成IR,進而形成抽象語法樹(Abstract Syntax Tree, AST)中間文件,樹中的節點表示諸如加減乘除等操作,其子節點表示其輸入操作數,比如圖4(a)表示寄存器形式的加法,該加法有兩個整數寄存器(iRegI)操作數和一個標志寄存器操作數。這個樹最終可簡單對應到一條本地的addl指令。

如果節點包含子樹,形成嵌套,則可表示更復雜的操作,如圖4(b)所示,mull有3個操作數,其運算結果又作為addl的操作數之一。該樹可能生成mull和addl兩條本地指令,也可能生成1條乘加指令。對于更復雜的樹,生成本地指令時可能面臨更復雜的多樣化選擇。為了生成最優的指令,Hotspot中采用自底向上重寫系統(bottom-up rewrite system,BURS)算法[7],根據目標機器體系結構描述,如本地指令與中間指令的關系、指令開銷等自下而上匹配AST,選擇最優本地指令。

四、結束語

Java虛擬機與體系結構密切相關,涉及處理器、操作系統核心、編譯器、基礎運行時庫等模塊,涉及機器碼、匯編、C、C++、Java語言,其自身結構復雜、技術先進、代碼龐大。為了滿足企業級應用對性能的最高要求,即時編譯模式不斷采用大量靜態編譯和激進編譯優化技術,同時又盡可能降低運行時開銷。

C2即時編譯器是一個專門面向服務器典型應用的充分優化過的先進自適應編譯器,強調的是程序運行的峰值性能。它支持許多和C++編譯器支持的相同類型的優化,以及一些傳統編譯器所不能做的自適應優化,如虛擬方法調用間的積極樂觀內聯(aggressive optimistic inlining)。與靜態編譯器相比,自適應編譯器是非常靈活的,在優化層面上有著無可比擬的競爭優勢,典型情況下甚至比先進的靜態分析和編譯技術更優秀、輸出的代碼質量更高。

本文深入分析HotSpot虛擬機的運行機制和C2即時編譯框架,為下一步深入面向平臺進行軟硬件協同優化打下好的基礎。

作者單位:鄭艷? ? 無錫城市職業技術學院

參? 考? 文? 獻

[1]周志明. 深入理解Java虛擬機-JAVA虛擬機高級特性與最佳實踐(第2版). 機械工業出版社, 2013.6

[2] Tim Lindholm, etc. The Java? Virtual Machine Specification. Oracle Corporation, Inc.

[3] Peter B. Kessler. Java HotSpot? Virtual Machine. http://openjdk.java.net/groups/hotspot/docs/FOSDEM-2007-HotSpot.pdf, 2007

[4] Sun Microsystems. The Java HotSpot Virtual Machine. A Technical White Paper.

[5] Michael Paleczny, Christopher Vick, and Cliff Click. The Java HotSpot Server Compiler. In Proceedings of the Java Virtual Machine Research and Technology Symposium, 1-12,USENIX, 2001

[6] ADL語法規范. JavaSoft HotSpot Architecture Description Language Syntax Specification. 1997.9

[7]Eduardo Pelegrí-Llopart, Susan L. Graham. Optimal Code Generation for Expression Trees: an Application BURS Theory. In Proceedings of the 15th ACM Symposium on Principles of Programming Languages, ACM Press, 294-308, 1988

主站蜘蛛池模板: 亚洲无码精彩视频在线观看| 精品91自产拍在线| 91久久国产成人免费观看| 广东一级毛片| 国产日本欧美亚洲精品视| 久久91精品牛牛| 黑色丝袜高跟国产在线91| 中字无码精油按摩中出视频| 91丨九色丨首页在线播放| 高清无码一本到东京热| 国产精品jizz在线观看软件| 亚洲午夜天堂| 天天躁夜夜躁狠狠躁躁88| 中文字幕在线一区二区在线| 久久精品国产91久久综合麻豆自制| 国产精品精品视频| 国产日韩AV高潮在线| 最新日韩AV网址在线观看| 澳门av无码| 日韩AV无码免费一二三区| 国产呦视频免费视频在线观看| 免费无码AV片在线观看中文| 免费不卡在线观看av| 她的性爱视频| 久久国产亚洲偷自| 国内精自视频品线一二区| 亚洲美女一区二区三区| 日日拍夜夜嗷嗷叫国产| P尤物久久99国产综合精品| 精品国产一区二区三区在线观看| 久久久噜噜噜| 国产日本欧美亚洲精品视| 亚洲男人的天堂久久精品| 青青草91视频| 国产精品露脸视频| 亚洲第一网站男人都懂| 乱人伦中文视频在线观看免费| 欧美激情福利| yy6080理论大片一级久久| 日韩无码白| 久久人搡人人玩人妻精品| 国产一二三区在线| 日韩av手机在线| 91福利片| 老色鬼久久亚洲AV综合| 四虎成人免费毛片| 国产小视频a在线观看| 亚洲国产天堂在线观看| 欧美日韩高清| 女人18毛片久久| 91丝袜美腿高跟国产极品老师| 热99re99首页精品亚洲五月天| 直接黄91麻豆网站| 久久久久亚洲av成人网人人软件| 香蕉久久国产超碰青草| 沈阳少妇高潮在线| 97se亚洲综合在线| 久热精品免费| 国产欧美视频在线| 2021最新国产精品网站| 亚洲三级视频在线观看| 国产精品免费露脸视频| 亚洲精品777| 欧美日韩亚洲综合在线观看| 免费人成又黄又爽的视频网站| 日本人妻丰满熟妇区| 2020精品极品国产色在线观看| 美女毛片在线| 国产香蕉97碰碰视频VA碰碰看| 国产精彩视频在线观看| 久久黄色小视频| 日韩欧美中文字幕一本| 日韩精品亚洲精品第一页| 97se亚洲综合在线天天| 国产精品xxx| 久久精品国产999大香线焦| 午夜视频www| 亚洲一区二区成人| 亚洲第一中文字幕| 亚洲人成色在线观看| 国产剧情国内精品原创| 国产靠逼视频|