針對JVM虛擬棧 和棧幀的操作
虛擬機棧:
棧元素是棧幀。方法調用,棧幀入棧,反之出棧。
棧幀:一個方法的運行空間。
1、局部變量表:方法定義的局部變量、方法的參數存在該表。
實例方法中有個隱含參數“this”,所以實例方法可以訪問該類的實例變量和其他實例方法。
局部變量表中變量的存放順序:this(如果是實例方法)=>參數(如果有)=> 定義的局部變量(如果有)
slot是局部變量表中的空間單元,虛擬機規範規定:
1、32位之內的數據,用一個slot來存放,如int、short、float等;
2、64位的數據用連續兩個slot來存放,如long、double;3、引用類型可32位亦可64位。
2、操作數棧:用來存放操作數。
局部變量表中的變量是不可直接使用的,如需使用必須通過相關指令將其加載至操作數棧中作爲操作數使用。
3、方法返回地址:
一個方法開始執行後,只有兩種方式可以退出這個方法。
第一種:執行引擎遇到任意一個方法返回的字節碼指令,這時候可能會有返回值傳遞給上層的方法調用者,是否有返回值和返回值的類型將根據遇到的何種方法返回指令來決定,這種退出的方式稱爲正常完成出口。
另一種:方法執行過程中遇到了異常,並且這個異常沒有在方法體內得到處理,無論是Java虛擬機內部產生的異常,還是代碼中使用athrow字節指令產生的異常,只要在本方法的異常表中沒有搜索到匹配的異常處理器,就會導致方法退出,
這種退出稱爲異常完成出口。
根據下面的代碼 模擬java虛擬機棧 棧幀的入棧 和出棧操作
public class Test { public static void main(String[] args) { new Test().a(); } public void a(){ b(); System.out.println("執行a方法結束"); } public void b(){ c(); System.out.println("執行b方法結束"); } public void c(){ System.out.println("執行C方法結束"); } }