棧幀的內部結構--動態鏈接 (Dynamic Linking)


每個棧幀中包含:

  • 局部變量表(Local Variables)
  • 操作數棧(Opreand Stack) 或表達式棧
  • 動態鏈接 (Dynamic Linking) (或指向運行時常量的方法引用)
  • 動態返回地址(Return Address) (或方法正常退出或者異常退出的引用的定義)
  • 一些附加信息

動態鏈接

  • 動態鏈接主要就是指向運行時常量池的方法引用

  • 每一個棧幀內存都包含一個指向運行時常量池中該棧幀所屬方法的引用,包含這個引用的目的就是為了支持當前方法的代碼能夠實現動態鏈接(Dynamic Linking)。比如invokedynamic 指令
  • 在Java源文件被編譯到字節碼文件中時,所有的變量和方法引用都作為符號引用(Symbolic Reference )保存在class文件的常量池里。比如,描述一個方法調用其他方法時,就是通過常量池中指向方法的符號引用來表示的,那么動態鏈接的作用就是為了將這些符號引用轉換為調用方法的直接引用

 

 

 1、方法的調用

在JVM中,將符號引用轉換為調用方法的直接引用與方法的綁定機制有關

方法的靜態鏈接與動態鏈接

  • 靜態鏈接:當一個字節碼文件被裝在進JVM內存時,如果被調用的目標方法在編譯期可知,且運行期保持不變時,這種情況下將調用方法的符號引用轉換為直接而引用的過程稱之為靜態鏈接。 例如,super()方法
  • 動態鏈接:如果被調用的方法無法在編譯期確定下來,也就是說,只能夠在程序運行期將調用方法的符號引用轉換為直接引用,由於這種引用轉換過程中具備動態性,因此也被稱之為動態鏈接。對應着接口回調,多態動態綁定等

與之對應的則是方法的綁定機制。早期綁定(Early Binding)和晚期綁定(late Binding)。綁定是一個字段、方法或者類在符號引用被替換為直接引用的過程,這里僅僅發生一次。

  • 早期綁定:早期綁定就是被調用的目標函數如果在編譯期可知,且運行期間保持不變,即可將這個方法與所屬的類型進行綁定。
  • 晚期綁定:如果被調用的方法在編譯期無法被確定下來,只能夠在程序運行期根據實際的類型確定相關的方法,被稱之為晚期綁定。其實也就是動態綁定

2、虛方法與非虛方法

  • 對應着進行早期綁定和靜態鏈接的定義,即在編譯期就確定了具體的調用版本,在運行時不可變,稱之為非虛方法
  • 靜態方法、私有方法、final方法、實例構造器、父類方法都是非虛方法
  • 其他方法稱之為虛方法
  • 子類對象的多態性使用的前提為:類的繼承關系,方法的重寫
  • 可以簡單的理解為自己寫的方法就是虛方法。

    • 在面向對象的編程中,會很頻繁的使用到動態分派,如果在每次動態分派的過程中都要重新在類的方法元數據中搜索合適的目標的話可能影響到執行效率,因此,為了提高性能,JVM采用在類的方法區建立一個虛方法表(virtual method table)(非虛方法不會出現在表中)來實現,使用索引表來替代查找
    • 每個類中都有一個虛方法表,表中存放着各個方法的實際入口
    • 虛方法表會在類加載的鏈接階段被創建並開始初始化,類的變量初始值准備完成以后,JVM會把該類的方法表也初始化完畢

3、方法的調用指令

  • 普通調用指令
    • invokestatic:調用靜態方法,解析階段確定唯一方法版本
    • invokesopecial:調用<init>方法、私有即父類犯法,解析階段確定唯一方法版本
    • invokevirtual:調用所有虛方法
    • invokeinterface:調用接口方法
  • 動態調用指令:
    • invokedynamic:動態解析出所有需要的方法,然后執行,(lamble表達式),和python一樣,變量不需要自己執行,運行時才知道

4、方法重寫的本質

  • 找到操作數棧頂的第一個元素所執行的對象的實際類型,記作C
  • 如果在類型C中找到與常量中的描述符合簡單名稱都相符的方法,則進行訪問權限校驗,如果通過則放回這個方法的直接引用,查找過程結束;如果不通過,則返回java.lang.illegalAccessError異常
  • 否則,按照繼承關系從上往下依次對C的各個父類進行第2步的搜索和驗證過程
  • 如果始終沒有找到合適的方法,則拋出java.lang.AbstactMethodError異常

附:JVM學習目錄


免責聲明!

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



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