概述
虛擬機棧描述的是Java方法執行的內存模型:每個方法被執行時,都會創建一個棧幀,用於存儲局部變量,操作數棧,動態鏈接,方法出口等信息。每一個方法從調用直至執行完成的過程,就對應着一個棧幀在虛擬機棧中入棧到出棧的過程。
棧幀結構,及邏輯圖
1.棧幀的概念
棧幀(Stack Frame)是用於支持虛擬機進行方法調用和方法執行的數據結構,它是虛擬機運行時數據區中的虛擬機棧(Virtual Machine Stack)的棧元素。
2.棧幀中的元素
棧幀存儲了方法的局部變量表、操作數棧、動態連接和方法返回地址等信息。
2.1.局部變量表
局部變量表是一組變量值存儲空間,用於存放方法參數和方法內部定義的局部變量。在Java程序編譯爲Class文件時,就在方法的Code屬性的max_locals數據項中確定了該方法所需要分配的局部變量表的最大容量。
2.2.操作數棧
操作數棧,它是一個後入先出棧。同局部變量表一樣,操作數棧的最大深度也在編譯的時候寫入到Code屬性的max_stacks數據項中。
2.3.動態連接
每個棧幀,在方法調用過程中的動態連接。Class文文件的常量池中存在大量的符號引用,字節碼中的方法調用指令就以常量池中指向方法的符號引用作爲參數。這些符號引用一部分會在類加載階段或者第一次使用的時候就轉化爲直接引用,這種轉化稱爲靜態解析。另外一部分將在每一次運行期間轉化爲直接引用,這部分稱爲動態連接。
2.4.方法返回地址
在方法退出之後,需要返回到方法被調用的位置,程序才能繼續執行,方法返回時可能需要在棧幀中保存一些信息,用來幫助恢復它的上層方法的執行狀態。
2.5.附加信息
虛擬機規範允許具體的虛擬機實現增加一些規範裏沒有描述的信息到棧幀之中,例如與調試相關的信息,這部分信息完全取決於具體的虛擬機實現。
下篇,我們將講到字節碼,深入瞭解棧幀的底層執行過程。