針對JVM虛擬棧 和棧幀的操做java
虛擬機棧:this
棧元素是棧幀。方法調用,棧幀入棧,反之出棧。blog
棧幀:一個方法的運行空間。虛擬機
一、局部變量表:方法定義的局部變量、方法的參數存在該表。class
實例方法中有個隱含參數「this」,因此實例方法能夠訪問該類的實例變量和其餘實例方法。變量
局部變量表中變量的存放順序:this(若是是實例方法)=>參數(若是有)=> 定義的局部變量(若是有)搜索
slot是局部變量表中的空間單元,虛擬機規範規定:引用
一、32位以內的數據,用一個slot來存放,如int、short、float等;float
二、64位的數據用連續兩個slot來存放,如long、double;三、引用類型可32位亦可64位。方法
二、操做數棧:用來存放操做數。
局部變量表中的變量是不可直接使用的,如需使用必須經過相關指令將其加載至操做數棧中做爲操做數使用。
三、方法返回地址:
一個方法開始執行後,只有兩種方式能夠退出這個方法。
第一種:執行引擎遇到任意一個方法返回的字節碼指令,這時候可能會有返回值傳遞給上層的方法調用者,是否有返回值和返回值的類型將根據遇到的何種方法返回指令來決定,這種退出的方式稱爲正常完成出口。
另外一種:方法執行過程當中遇到了異常,而且這個異常沒有在方法體內獲得處理,不管是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方法結束"); } }