一、運(yùn)行時(shí)棧幀結(jié)構(gòu)
? ?棧幀是用于支持虛擬機(jī)方法調(diào)用和方法執(zhí)行的結(jié)構(gòu)码倦,棧幀存儲(chǔ)了方法的局部變量表,操作數(shù)棧锭碳,動(dòng)態(tài)鏈接袁稽,方法返回地址等信息。每一個(gè)方法從調(diào)用開始到執(zhí)行完成的過程擒抛,都對應(yīng)一個(gè)棧幀在虛擬機(jī)棧從入棧到出棧的過程运提。在編譯程序代碼的時(shí)候蝗柔,棧幀需要分配多大內(nèi)存已經(jīng)確定。
局部變量表:用于存放方法參數(shù)和和方法內(nèi)部定義的局部變量民泵。
操作數(shù)棧:
動(dòng)態(tài)鏈接:每個(gè)棧幀都包含一個(gè)指向運(yùn)行時(shí)常量池中該棧幀所屬的方法引用癣丧,持有這個(gè)方法引用是為了調(diào)用過程中的動(dòng)態(tài)鏈接。我們知道常量池中有大量的符號(hào)引用栈妆,字節(jié)碼中的方法調(diào)用指令胁编,就以常量池中指向方法的符號(hào)引用作為參數(shù),這些符號(hào)引用部分會(huì)在類加載或者第一次使用時(shí)就轉(zhuǎn)化為直接引用鳞尔,這種轉(zhuǎn)化稱為靜態(tài)分析嬉橙,另外一部分將在每次運(yùn)行期間轉(zhuǎn)化為直接引用,這部分稱為動(dòng)態(tài)鏈接寥假。
方法返回地址:方法退出有兩種方式市框,執(zhí)行引擎遇到任何一個(gè)方法返回的字節(jié)碼指令,正常退出糕韧,也可能遇到異常退出枫振。
二、方法調(diào)用
? 解析
?方法在程序真正運(yùn)行之前就有一個(gè)確定的版本萤彩,并且這個(gè)方法的調(diào)用版本在運(yùn)行期不可變的粪滤,調(diào)用目標(biāo)在程序?qū)懞茫幾g器在進(jìn)行編譯時(shí)就必須確定下來雀扶,這類方法稱為解析杖小。這類方法包括靜態(tài)方法和私有方法,實(shí)例構(gòu)造器愚墓,父類方法予权,前者直接與類型連續(xù),后者外部不可訪問浪册,它們在加載的時(shí)候就把符號(hào)引用轉(zhuǎn)為直接引用扫腺,這些方法稱為非虛方法
分派
調(diào)用可能是靜態(tài)的也可能是動(dòng)態(tài)的。
靜態(tài)分派:重載時(shí)使用哪個(gè)版本议经,完全取決于傳入的參數(shù)和 ?數(shù)據(jù)類型,虛擬機(jī)在重載時(shí)通過參數(shù)的靜態(tài)類型而不是實(shí)際類型作為判定依據(jù)谴返。并且靜態(tài)類型在編譯期可知的煞肾,所以更具靜態(tài)類型決定使用哪個(gè)重載版本。
動(dòng)態(tài)分派:重寫(Overide)的體現(xiàn)嗓袱。在運(yùn)行期間根據(jù)實(shí)際類型確定方法的執(zhí)行版本的分派過程稱為動(dòng)態(tài)分派籍救。
三、基于棧的字節(jié)碼解釋執(zhí)行引擎
? 1渠抹、基于棧的指令集和基于寄存器的指令集
? ?基于棧的指令集:依賴于操作數(shù)進(jìn)行操作蝙昙,優(yōu)點(diǎn)可移植闪萄,代碼相對緊湊,編譯實(shí)現(xiàn)更加簡單奇颠,缺點(diǎn):執(zhí)行速度相對慢一些败去,指令數(shù)量相同功能較多,訪問內(nèi)存頻繁烈拒,棧頂緩存圆裕,常用操作映射的寄存器。
? ?寄存器指令集:寄存器由硬件提供荆几,程序直接依賴這些硬件寄存器不可避免地受到硬件的約束吓妆。
2、基于棧的解釋器執(zhí)行過程
??