一、運行時棧幀結構
1、棧幀(Stack Frame)是用於支持虛擬機進行調用和方法執行的數據結構,它是虛擬機運行時數據區中的虛擬機棧(Virtual Method Stack)的棧元素,棧幀存儲了方法的局部變量表,操作數棧,動態連接和方法返回地址等信息。
2.局部變量表(Local Virtual Table)
局部變量表是一組變量值存儲空間,用於存放參數和方法內部定義的局部變量。
局部變量表的容量以變量曹(Variable Slot)為最小單位。slot應該能存放一個Boolean,byte,char , short,int , float,reference或returnAddress類型的變量的數據。
虛擬機通過索引定位的方式使用局部變量表,索引值得范圍是從0開始至局部變量表最大的slot數量。
在方法執行時,虛擬機是使用局部變量表來完成參數到參數列表的傳遞過程。
3.操作數棧(Operand Stack)
操作數棧也常稱為操作站,它是一個後入先出(LILO)棧。
當一個剛剛開始執行的時候,這個方法的操作數棧是空的,在方法的執行過程中會有各種字節碼指令往操作數棧中寫入和提取內容也就是出棧和入棧操作。
4.動態連接
每個棧幀都包含一個指向運行時常量池中該棧幀所屬方法的引用,持有這個引用是為了支持調用過程中的動態連接(Dynamic Linking)。
5.方法返回地址
當一個方法開始執行引擎遇到任何一個方法返回的字節碼指令,這時候可能會有返回值傳遞給上層的方法調用者,是否有返回值和返回值的類型將根據遇到何種方法返回指令來決定,這種退出方法的方式稱為正常完成出口。
另一種退出的方式是,在方法中執行過程中遇到了異常並且這個異常沒有在方法體內部得到處理,無論在Java虛擬機內部產生的異常,還是代碼中使用athrow字節碼指令產生的異常,只要在本方法的異常表中沒有搜索到匹配的異常處理器,就會導致方法退出,這種退出方式稱為異常完成出口。
二、方法調用
解析調用一定是一個靜態的過程,在編譯期間就完全確定,在類裝載的解析階段就會把涉及的符號引用全部轉換為可確定的直接引用,不會延遲到運行期再去完成。
還有一種方法調用是分派調用。