java JVM運行時棧幀結構

來源:互聯網
上載者:User

JVM中資料區域分為虛擬機器棧、JAVA堆、方法區、運行時常量池、程式計數器(PC寄存器)這幾類。在這五類中,虛擬機器棧用來表示各個線程中方法執行情況的地區,而棧幀是虛擬機器棧中的棧元素。棧幀是用於支援虛擬機器進行方法調用和方法執行的資料結構。每一個方法從調用開始到執行完成的過程都可以看作是一個棧幀於虛擬機器棧中從入棧到出棧的過程。

一個線程中有很多個棧幀,只有位於這個棧最上方的棧幀才是有效,最上方棧頂的棧幀我們稱之為當前棧幀,當前棧幀關聯的方法我們稱之為當前方法。虛擬機器的執行引擎的位元組碼指令只會對當前棧幀(當前方法)起作用。

棧幀組成 局部變數表 運算元棧 動態連結 返回地址 其他資訊

局部變數表

局部變數表顧名思義,用於儲存方法中的局部變數。值得注意的是,它不僅僅儲存在方法內部聲明的局部變數方法參數列表中的變數非static方法隱含的this指標try-catch塊中catch中的異常物件變數都是局部變數表中的變數。局部變數表的大小在運行之前已經確定,原因是在java檔案編譯後的class檔案的方法表的code屬性中有一條屬性用來表示該方法所需的局部變數表大小。

局部變數表的容量以變數槽(Slot)為單位,虛擬機器規範中沒有明確的規定一個變數槽具體有多大,只是很有指向性的表示除了long和double之外的資料都用一個Slot大小來存放,而long與double要用兩個Slot來存放。而且需要注意的是局部變數表的大小不是簡單的將每個變數的大小相加而得到的,而是通過計算每個變數的範圍,科學的計算一個最小的大小。比如一個在某段之後失效的局部變數,留下的空間可以給其他的變數做空間而不需要申請更多的局部變數表的空間。

運算元棧

運算元棧也稱為操作棧,結構為一個後進先出的棧,用來進行方法中的一些運算。和局部變數表類似的,在java檔案編譯後的class檔案中就有規定運算元棧的最大深度。很多書中都用iadd來舉例,這是一個簡單的例子,iadd位元組碼指令表示將兩個int類型的資料相加,那麼在這個位元組碼執行之前,我們肯定已經通過某些位元組碼將兩個局部變數表中的int類型資料壓入運算元棧中,然後通過iadd相加進行操作。需要注意的是在運算元棧中,只有long和double可以佔有兩個深度。

實際上,運算元棧非常重要,JAVA虛擬機器的解釋執行引擎稱為“基於棧的執行引擎”,其中所指的“棧”就是運算元棧。而且通過某些最佳化手法,兩個棧幀的一個運算元棧和另一個局部變數表是有重疊的,這樣在方法調用的時候就可以省略某些額外的參數傳遞開銷。

動態連結

每個棧幀內部都包含一個指向當前方法所在類型的運行時常量池的引用,以便對當前方法的代碼實現動態連結。在class檔案裡面,一個方法如果要調用另外一個方法,或者訪問其成員變數,則需要通過符號引用來表示,那麼動態連結的作用就是在恰當的時候將這些以符號引用所表示的方法或是變數解析成直接引用。

返回地址

我們說棧幀中包括返回地址,可能這樣說有些勉強,畢竟返回地址是一個返回的狀態和概念,不是一個具體的結構。當一個方法開始執行後,只有兩種方法能夠退出這個方法。第一種方法就是在方法執行時遇到了return語句(遇到一個返回位元組碼指令),這個時候正常退出該方法,並且將相應的方法的傳回值傳遞給該方法的調用者。第二種方法就是在該方法中遇到了一個異常,而且異常沒有通過try-catch來捕獲(在這裡討論虛擬機器內部結構的時候我說try-catch這種java文法上的結構不是很好,但是為了能夠方便的表達清楚我這樣做了)或者是自己throw拋出一個異常(athrow指令拋出異常)。在這兩種情況下,只要在本方法中沒有匹配到異常處理器,就會導致方法退出,一個異常退出的方法不會再給該方法的調用者一個傳回值。

正常的退出情況,退回到該方法的調用者中被調用的位置(這個具體的位置被PC寄存器記錄)。而異常的退出情況返回地址要通過異常處理器來確定,棧幀中一般不儲存這部分資訊。

其他資訊

虛擬機器規範中允許具體的虛擬機器在實現的時候增加一些規範中沒有的資訊。在實際開發的過程中,一般我們會把動態連結方法返回地址與其他附加資訊歸為一類。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.