1. 概述
「虛擬機器」是乙個相對於「物理機」的概念,這兩種機器都有**執行能力,其區別是物理機的執行引擎是直接建立在處理器、硬體、指令集和作業系統層面上的,而虛擬機器的執行引擎是自己實現的,因此可以自行制定指令集與執行引擎的結構體系,並且能夠執行那些不被硬體直接支援的指令集格式。
2. 執行時棧幀結構
棧幀是用於支援虛擬機器進行方法呼叫和方法執行的資料結構,它是虛擬機器執行時資料區中的虛擬機器棧的棧元素。每乙個方法從呼叫開始至執行完成過程,都對應這乙個棧幀在虛擬機器棧裡面從入棧到出棧的過程。每乙個棧幀都包括了區域性變數表、運算元棧、動態連線、方法返回位址和一些額外的附加資訊。
(1) 區域性變數表
區域性變數表是一組變數值儲存空間,用於存放方法引數和方法內部定義的區域性變數。
(2) 運算元棧
當乙個方法剛剛開始執行的時候,這個方法的運算元棧是空的,在方法執行的過程中,會有各種位元組碼指令往運算元棧中寫入和提取內容,也就是出棧/入棧操作。
(3) 動態連線
每個棧幀都包含乙個指向執行時常量池中該棧幀所屬方法的引用,持有這個引用是為了支援方法呼叫過程的動態連線。class檔案的常量池中存有大量的符號引用,位元組碼中的方法呼叫指令就以常量池中指向方法的符號引用作為引數。這些符號引用一部分會在類載入階段或者第一次使用的時候就轉化為直接引用。這種轉化稱為靜態解析。另外一部分將在每一次執行期間轉化為直接引用,這部分稱為動態連線。
(4) 方法返回位址
方法退出的過程實際上就等同於把當前棧幀出棧,因此退出時可能執行的操作有:回覆上層方法的區域性變數表和運算元棧,把返回值壓入呼叫者棧幀的運算元棧中,調整pc計數器的值以指向方法呼叫指令後面的一條指令等。
3. 方法呼叫
一切方法呼叫在class檔案裡面儲存的都只是符號引用,而不是方法在實際執行時記憶體布局的入口位址(直接引用)。
(1) 解析
所有方法呼叫中的目標方法在class檔案裡面都是乙個常量池中的符號引用,在類載入的解析階段,會將其中的一部分符號引用轉化為直接引用。
java 虛擬機器位元組碼執行引擎
一 執行時棧幀結構 棧幀分配多少記憶體,與執行時無關 1 區域性變數表 容量以slot 槽為單位 乙個slot 占用32位長度的記憶體空間,可以存的型別有boolean byte char short int float reference retuanaddress 二個slot 可以存long ...
JVM之虛擬機器位元組碼執行引擎
執行時棧幀結構 棧幀儲存方法的區域性變數表 運算元棧 動態鏈結和方法返回位址等,每乙個方法由開始到結束,都對應著乙個棧幀在虛擬機器裡面的出棧入棧過程。對於執行引擎來說,在活動的執行緒中,只有位於棧頂的棧幀才有效,叫做當前棧幀,與這個棧幀相關聯的方法叫做當前方法。區域性變數表 是一組變數值儲存空間,存...
JVM 8 虛擬機器位元組碼執行引擎
在活動執行緒中,只有棧頂的棧時有效的,稱為當前棧幀,與這個棧幀相關聯的方法稱為當前方法。下面對棧幀的4個主要部分進行分析。存放方法引數和方法內部定義的區域性變數 一些細節 優點 可移植性 更加緊湊 編譯器實現更緊湊。確定就是速度更慢。指向執行時常量池中該棧幀所屬方法的引用,這個引用的為了支援方法呼叫...