一、執行引擎
“虛擬機”的概念是相對於“物理機”而言的,這兩種“機器”都有執行代碼的能力。物理機的執行引擎是直接建立在硬件處理器、物理寄存器、指令集和操作系統層面的;而“虛擬機”的執行引擎是自己實現的,因此可以自定義指令集和執行引擎的結構體系,而且可以執行那些不能被硬件直接支持的指令。
在不同的“虛擬機”實現里面,執行引擎在執行JAVA代碼的時候有兩種方式:解析實行(通過解釋器執行)和編譯執行(通過即時編譯器編譯成本地代碼執行)。
二、運行時數據結構
棧幀
棧幀是用於支持虛擬機進行方法調用和方法執行的數據結構,他是虛擬機運行時數據區的虛擬機棧的棧元素。棧幀存儲了方法的局部變量表、操作數棧、動態鏈接和方法的返回地址等信息。每一個方法從調用開始直至執行完成的過程,都對應的一個棧幀在虛擬機棧里入棧和出棧的過程。
在編譯程序代碼的時候,棧幀中需要多大的局部變量表,多深的操作數棧都已經完全確定了,並且寫入到方法表的Code屬性中,因此一個棧幀需要多大的內存,不會受到程序運行期變量數據的影響。
一個線程的方法調用鏈可能會很長,很多方法會同時處於執行狀態。對於執行引擎來說,在當前活動的線程中,只有位於棧頂的棧幀才是有效的,成為當前棧幀,與這個棧幀相關聯的方法成為當前方法。
典型的棧幀概念模型如下圖所示: