棧幀的內部結構--動態返回地址(Return Address)


每個棧幀中包含:

  • 局部變量表(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計數器的值作為返回地址,即調用該方法的指令的下一條指令的地址,而通過異常退出的,返回地址是要通過異常表來確定,棧幀中一般不會保存這部分信息
  • 本質上,方法的退出就是當前棧幀出棧的過程,此時,需要恢復上層方法的數據區等信息,讓調用者方法繼續執行下去
  • 正常完成出口和異常完成出口的區別在於,通過異常完成出口推出的不會給他的上層調用者產生任何的返回值

 

附:JVM學習目錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM