1. 程式人生 > >幀棧、區域性變量表、運算元棧

幀棧、區域性變量表、運算元棧

棧幀(frame)

棧幀是用來儲存資料和部分過程結果的資料結構,同時也用來處理動態連結(dynamic linking)、方法返回值和異常分派(dispatch exception)。
棧幀隨著方法的呼叫而建立,隨著方法的銷燬而銷燬(無論方法正常執行還是拋異常都算方法結束)。棧幀的儲存空間由建立他的執行緒分配在java虛擬機器中,每一個棧幀都有自己的本地變量表(local variable)、運算元棧(operand stack)和指向當前方法所屬的類的執行時常量池的引用。
在某個時間,只有目前正在執行的那個方法的棧幀是活動的這個棧稱為當前棧(current frame),這個棧幀對應的方法叫當前方法(current  method),定義這個方法的類稱為當前類(current class)。
在方法的結束或返回之際,當前棧幀會傳回此方法的執行結果給前一個棧幀,然後虛擬機器會丟棄當前棧,使前一個棧幀重新成為當前棧。
注意 棧幀是執行緒本地私有的資料,不可能在一個棧幀之中引用另外一個執行緒的棧幀。


 區域性變量表

每個幀棧內部都包含一組稱為區域性變量表的變數列表。
區域性變量表使用索引來進行定位訪問。首個區域性變數的索引為0;
java虛擬機器使用區域性變量表來完成方法呼叫時的引數傳遞;


 運算元棧 

每個棧幀內部都包含一個稱為運算元棧的後進先出棧。棧幀中運算元的最大深度由編譯期決定。
幀棧在剛剛建立時,運算元棧是空的。java虛擬機器提供的一些位元組碼指令來從區域性變量表或物件例項的欄位中複製常量或變數值到運算元棧中,也提供了一些指令用於從運算元棧取走資料、操作資料以及把操作結果重新入棧。

在任意時刻,運算元棧都會有一個確定的棧深度,一個long或double型別的資料會佔兩個單位的棧深度,其他資料型別則會佔用一個單位的棧深度。

變數想要被執行,就要加入到運算元棧中。