我看Java虛擬機(6)---虛擬機字節碼執行

棧幀是虛擬機棧中的棧元素,棧幀存儲方法的局部變量表操作數棧動態鏈接方法返回地址信息附加信息

局部變量表:

局部變量表單位成爲變量槽(Slot),一個Slot存儲32位以內的數據類型,對於long和double,64位,可分爲兩個Slot存儲,由於虛擬機棧是線程獨有的,所以這麼存儲是安全的。
Slot是複用的,當某一Slot數據超出作用範圍,它就可以被複用。
對於實例方法,局部變量表索引爲0的位置是指向該方法所屬的實例的。
局部變量必須賦初始值,局部變量沒有類加載準備那一階段。

操作數棧

基於棧的指令和基於寄存器的指令對比:
基於棧:優點是不依賴具體硬件實現;缺點是同一動作,翻譯後的指令數目多,訪問內存影響速度。

動態連接

棧幀會包含指向運行時常量池中該棧幀所屬方法的引用,除了靜態方法私有方法實例構造器父類方法還有final方法)會在解析階段就將符號引用轉化爲直接引用外,其他符號引用將在運行期間將符號引用轉換爲直接引用。

方法返回地址

  • 恢復上層方法的操作數棧和局部變量表
  • 將該方法的計算結果壓入上層方法的
  • PC計數器指向下一條指令

附加信息

例如調試信息等。


方法調用

關於方法調用,注意以下幾點:

  • 重載是靜態分派,根據引用類型來判斷,不管實際類型;多宗量
public class F{}
public class S1 extends F{}
public class S2 extends F{}
public class Test{
    public void fun(F){System.out.println("F");}
    public void fun(S1){System.out.println("S1");}
    public void fun(S2){System.out.println("S2");}
    public static void main(String[] args){
        F f1 = new S1();
        F f2 = new S2();
        Test t = new Test();
        t.fun(f1);
        t.fun(f2);
    }
}
運行結果:
F
F
  • 重寫是動態分派,單宗量
    這就不舉例了,會根據實際類型來選取將要執行哪個方法。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章