每個棧幀中包含:
- 局部變量表(Local Variables)
- 操作數棧(Opreand Stack) 或表達式棧
- 動態鏈接 (Dynamic Linking) (或指向運行時常量的方法引用)
- 動態返回地址(Return Address) (或方法正常退出或者異常退出的引用的定義)
- 一些附加信息
動態返回地址(return address)
- 存放該調用方法的pc寄存器的值
- 一個方法的結束,有兩種方式
- 遇到return,將返回值傳遞給上層方法調用者,簡稱正常完成出口(返回指令包括ireturn(返回值為boolean,byte,char,short,int),lreturn,freturn,dreturn,以及areturn,還有return 返回為void、實例初始化方法,類和接口的初始化方法)
- 異常完成出口,即碰到了異常,並且沒有在方法內進行處理,就會退出方法。方法在執行過程總拋出異常時的異常處理,儲存在一個異常處理表,方法在發生異常時候找到處理異常的代碼
- 無論通過哪種方式退出,在方法退出后都返回到該方法被調用的位置。方法正常退出時,調用者的pc計數器的值作為返回地址,即調用該方法的指令的下一條指令的地址,而通過異常退出的,返回地址是要通過異常表來確定,棧幀中一般不會保存這部分信息
- 本質上,方法的退出就是當前棧幀出棧的過程,此時,需要恢復上層方法的數據區等信息,讓調用者方法繼續執行下去
- 正常完成出口和異常完成出口的區別在於,通過異常完成出口推出的不會給他的上層調用者產生任何的返回值