1. 程式人生 > >分析JVM虛擬機器棧的棧幀結構

分析JVM虛擬機器棧的棧幀結構

1.先說虛擬機器棧:

    虛擬機器棧是位於虛擬機器記憶體中的一片記憶體區域,它是執行緒私有的(一個執行緒分配一個虛擬機器棧空間)。它用來儲存棧幀,一個棧幀就對應著一個方法。棧幀的出棧和入棧對應著方法的結束和呼叫的開始。

2.再說棧幀

    一個完整的棧幀儲存著以下資訊:區域性變量表,運算元棧,棧幀資訊三大部分,下面我們依次解析這三個部分。

    2.1區域性變量表:

        區域性變量表儲存著方法的引數和區域性變數。這些表項可以是基本型別資料和引用資料型別,特別要注意的是引用資料型別:一個引用型別資訊應該能做到兩點:1)通過這個引用找到這個引用物件在堆中資料存放的起始地址入口(即物件在記憶體中的實體地址)。2)通過這個引用能夠找到物件的實際型別在方法去中的型別資訊(儲存著類變數以及方法等)。

    2.2運算元棧

        用來執行方法中的具體程式碼,如:計算,賦值,判斷等等操作。【個人看來運算元棧更像是一種輔助工具,用來儲存中間的操作結果】

    2.3棧幀資訊

        棧幀資訊包括:方法本身的符號引用,方法返回地址,附加資訊。

        方法本身的符號引用:指向方法區中執行時常量池中的該方法的入口地址。如果這個方法是非虛方法,那麼這個符號引用在編譯時就轉化為直接引用,如果這個符號引用是一個虛方法,那麼會在方法呼叫的時候動態連結到對應的方法。

        方法返回地址:一個方法的返回方式只有兩種:1)執行引擎遇到返回return語句,這時候會將返回值傳遞給上層的方法呼叫者,這種退出方法的方式稱為正常完成出口。2)方法執行過程中出現異常,並且這個異常沒有在方法中得到處理,只要本方法的異常表中沒有搜尋到匹配的異常處理器,就會導致方法退出,這種退出方式稱為異常完成出口,不會給他的上層呼叫者任何返回值。

        附加資訊:一些除錯資訊或者其他的附加資訊。

3.最後說虛擬機器棧如何插入與消除棧幀:

    方法呼叫在一個執行緒中採用的是責任鏈機制,每當呼叫一個方法的時候會就會向當前棧幀中插入該方法對應的棧幀,只有棧頂的方法是當前執行緒有效的(即正在執行的)。方法退出的時候,會返回到上一層棧幀繼續程式的執行。