一、運行時棧幀結構
? ?棧幀是用于支持虛擬機方法調用和方法執(zhí)行的結構,棧幀存儲了方法的局部變量表,操作數(shù)棧,動態(tài)鏈接,方法返回地址等信息。每一個方法從調用開始到執(zhí)行完成的過程,都對應一個棧幀在虛擬機棧從入棧到出棧的過程。在編譯程序代碼的時候,棧幀需要分配多大內存已經確定。
局部變量表:用于存放方法參數(shù)和和方法內部定義的局部變量。
操作數(shù)棧:
動態(tài)鏈接:每個棧幀都包含一個指向運行時常量池中該棧幀所屬的方法引用,持有這個方法引用是為了調用過程中的動態(tài)鏈接。我們知道常量池中有大量的符號引用,字節(jié)碼中的方法調用指令,就以常量池中指向方法的符號引用作為參數(shù),這些符號引用部分會在類加載或者第一次使用時就轉化為直接引用,這種轉化稱為靜態(tài)分析,另外一部分將在每次運行期間轉化為直接引用,這部分稱為動態(tài)鏈接。
方法返回地址:方法退出有兩種方式,執(zhí)行引擎遇到任何一個方法返回的字節(jié)碼指令,正常退出,也可能遇到異常退出。
二、方法調用
? 解析
?方法在程序真正運行之前就有一個確定的版本,并且這個方法的調用版本在運行期不可變的,調用目標在程序寫好,編譯器在進行編譯時就必須確定下來,這類方法稱為解析。這類方法包括靜態(tài)方法和私有方法,實例構造器,父類方法,前者直接與類型連續(xù),后者外部不可訪問,它們在加載的時候就把符號引用轉為直接引用,這些方法稱為非虛方法
分派
調用可能是靜態(tài)的也可能是動態(tài)的。
靜態(tài)分派:重載時使用哪個版本,完全取決于傳入的參數(shù)和 ?數(shù)據類型,虛擬機在重載時通過參數(shù)的靜態(tài)類型而不是實際類型作為判定依據。并且靜態(tài)類型在編譯期可知的,所以更具靜態(tài)類型決定使用哪個重載版本。
動態(tài)分派:重寫(Overide)的體現(xiàn)。在運行期間根據實際類型確定方法的執(zhí)行版本的分派過程稱為動態(tài)分派。
三、基于棧的字節(jié)碼解釋執(zhí)行引擎
? 1、基于棧的指令集和基于寄存器的指令集
? ?基于棧的指令集:依賴于操作數(shù)進行操作,優(yōu)點可移植,代碼相對緊湊,編譯實現(xiàn)更加簡單,缺點:執(zhí)行速度相對慢一些,指令數(shù)量相同功能較多,訪問內存頻繁,棧頂緩存,常用操作映射的寄存器。
? ?寄存器指令集:寄存器由硬件提供,程序直接依賴這些硬件寄存器不可避免地受到硬件的約束。
2、基于棧的解釋器執(zhí)行過程
??