国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

虛擬機字節(jié)碼執(zhí)行引擎

2019-11-14 12:22:25
字體:
供稿:網(wǎng)友

我們知道,javac編譯器完成了程序代碼經(jīng)過詞法分析、語法分析到抽象語法樹、再遍歷語法樹生成線性的字節(jié)碼指令流的過程。而字節(jié)碼文件再經(jīng)過加載、驗證、準備、解析、初始化等階段才能被使用。字節(jié)碼執(zhí)行引擎正是執(zhí)行了這樣的過程:輸入的是字節(jié)碼文件,處理過程是字節(jié)碼解析的等效過程,輸出的是執(zhí)行結(jié)果。

運行時棧幀結(jié)構(gòu)

棧幀(stack frame)是用于支持虛擬機進行方法調(diào)用和方法執(zhí)行的數(shù)據(jù)結(jié)構(gòu),它是虛擬機運行時數(shù)據(jù)區(qū)中的虛擬機棧的棧元素。棧中存儲了方法的局部變量表、操作數(shù)棧、動態(tài)鏈接和方法返回地址等信息。每一個方法從調(diào)用開始到執(zhí)行完成的過程,就對應著一個棧幀在虛擬機棧里面從入棧到出棧的過程。 在編譯程序代碼的時候,棧幀中需要多大的局部變量表、多深的操作數(shù)棧都已經(jīng)完全確定了,并且寫入到方法表的Code屬性之中,因此一個棧幀需要分配多少內(nèi)存,不會受到程序運行期變量數(shù)據(jù)的影響,而僅僅取決于具體的虛擬機實現(xiàn)。 注:對于執(zhí)行引擎來講,活動線程中,只有棧頂?shù)臈怯行У模Q為當前棧幀,這個棧幀所關聯(lián)的方法稱為當前方法執(zhí)行引擎所運行的所有字節(jié)碼指令都只是針對當前棧幀進行操作。

局部變量表

一組變量值存儲空間,用于存放方法參數(shù)和方法內(nèi)部定義的局部變量。 局部變量表的容量以變量槽為最小單位,每個slot都應該能存放一個boolean,byte,short,int,char,float,reference,returnAddress類型的數(shù)據(jù),對于64位的數(shù)據(jù)類型只有double,long兩種(reference可能為32位也可能為64位),這兩種類型占用兩個slot。 虛擬機是使用局部變量表完成參數(shù)值到參數(shù)變量列表的傳遞過程,如果是實例方法(非static)那么局部變量表中第0位索引的slot默認是用于傳遞方法所屬對象實例的引用,方法中可以通過this來訪問這個隱含的參數(shù)。其余參數(shù)則按照參數(shù)表的順序來排列,占用從1開始的局部變量slot,參數(shù)表分配完畢之后,再根據(jù)方法體內(nèi)部定義的變量順序和作用域分配其余的slot。 注:類變量有兩次賦值的過程,一次在準備階段,賦予系統(tǒng)初始值(比如int默認值為0,boolean默認值為false,object類型默認值為null等),另外一次在初始化階段,賦予程序員定義的初始值。因此即使在初始化階段程序員沒有為類變量賦值也沒用關系,類變量仍然具有一個確定的初始值。但是局部變量若是定義了但沒有賦初始值是沒法使用的,類加載將會失敗。

操作數(shù)棧

操作數(shù)棧是用來存放操作數(shù)的棧結(jié)構(gòu)。當一個方法剛開始執(zhí)行的時候,這個方法的操作數(shù)棧是空的,在方法的執(zhí)行過程中,會有各種字節(jié)碼指令向操作數(shù)棧中寫入和提取內(nèi)容,也就是入棧和出棧的操作。 注:java虛擬機的解釋執(zhí)行引擎稱為基于棧的執(zhí)行引擎,其中所指的棧就是操作數(shù)棧。

動態(tài)連接

每個棧幀都包含一個指向運行時常量池中該棧幀所屬方法的引用,持有這個引用是為了支持方法調(diào)用過程中的動態(tài)連接。我們知道class文件的常量池中存有大量的符號引用,字節(jié)碼中的方法調(diào)用指令就以常量池中指向方法的符號引用為參數(shù)。這些符號引用一部分會在類加載階段或第一次使用的時候轉(zhuǎn)化為直接引用,這種轉(zhuǎn)化為稱為靜態(tài)解析,另外一部分將在每一次的運行期間轉(zhuǎn)化為直接引用,這部分稱為動態(tài)連接。

方法返回地址

方法被執(zhí)行后,有兩種方式退出這個方法。第一種方法是執(zhí)行引擎遇到任意一個方法的返回的字節(jié)碼指令。另外一種退出方式是在方法執(zhí)行過程中遇到了異常,并且這個異常并沒有在方法體中得到處理。方法退出之后,需要返回到方法被調(diào)用的位置,程序才能繼續(xù)執(zhí)行,方法返回時需要在棧幀中保存一些信息,用以幫助它恢復它上層方法的執(zhí)行狀態(tài)。一般情況下,調(diào)用者的pc計數(shù)器的值可以作為返回地址,棧幀中很可能會保存這個計數(shù)器值,方法異常退出時,返回地址是要通過異常處理器表來確定,棧幀中一般不會保存這部分信息。

方法退出的過程實際上等同于把當前棧幀出棧,所以可能需要執(zhí)行這些操作:恢復上層方法的局部變量表和操作數(shù)棧,把返回值壓入調(diào)用者棧的操作數(shù)棧中,調(diào)整pc計數(shù)器的值。 附加信息:虛擬機規(guī)范允許具體的虛擬機實現(xiàn)增加一些規(guī)范里沒有描述的信息到棧幀中,這部分信息取決于具體的虛擬機實現(xiàn)。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 灯塔市| 新野县| 新余市| 宝山区| 顺义区| 仪陇县| 禄劝| 共和县| 修文县| 惠水县| 凌云县| 祁连县| 绍兴县| 千阳县| 芜湖市| 儋州市| 达州市| 新巴尔虎左旗| 清原| 宝兴县| 页游| 临汾市| 读书| 华池县| 潼南县| 镇巴县| 南京市| 衡南县| 临夏市| 泰宁县| 湖北省| 襄樊市| 成都市| 南部县| 海丰县| 乌海市| 中西区| 乌海市| 五原县| 句容市| 明光市|