執行時棧幀結構:
棧幀儲存方法的區域性變數表、運算元棧、動態鏈結和方法返回位址等,每乙個方法由開始到結束,都對應著乙個棧幀在虛擬機器裡面的出棧入棧過程。
對於執行引擎來說,在活動的執行緒中,只有位於棧頂的棧幀才有效,叫做當前棧幀,與這個棧幀相關聯的方法叫做當前方法。
區域性變數表:
是一組變數值儲存空間,存放方法引數和方法內部的區域性變數。以變數槽為最小單位,在方法執行的時候,虛擬機器使用區域性變數表完成引數值到引數變數列表的傳遞過程,如果執行的是例項方法,區域性變數表中的第0位索引的slot預設用於傳遞方法所屬物件例項的引用,在方法中可以用this來訪問這個隱藏的引數。這也就說明了,為什麼靜態方法不能直接訪問非靜態變數和呼叫非靜態方法。
區域性變數表不會像類變數存在準備階段,類變數有兩次初始化過程,一是準備階段,賦予系統預設值,二是初始化階段,賦予程式定義的值。而區域性變數表必須進行初始化,只定義沒有賦值是無法使用的。
運算元棧:
後入先出的棧,編譯時確定最大深度,在方法執行是會往運算元棧中寫入或者提取內容。運算元棧中的資料型別必須與位元組碼指令的序列嚴格匹配。
每個棧幀都包含乙個指向執行時常量池中該棧幀所屬方法的引用,只持有這個引用是為了支援方法呼叫過程中的動態鏈結。
當乙個方法執行時只有兩種方法退出,第一種是執行引擎遇到任意乙個方法返回的位元組碼指令,這時候可能會返回值傳遞給上層的方法呼叫者,稱為正常退出。第二種是在執行過程中遇到了異常,並且這個異常沒有在方法體內處理,稱為異常完成出口,是不會給上層呼叫者返回任何東西的。
方法呼叫:
方法呼叫不等於方法執行,方法呼叫階段唯一的作用是確定方法的版本
所有方法呼叫中的目標方法在class檔案中都是乙個常量池中的符號引用,在類載入解析階段,會將其中一部分轉換為直接引用,即方法的入口位址。這種接戲的前提是方法在真正執行前可以被唯一的確定乙個版本,並且這個方法版本在執行期是不可改變的,主要包括靜態方法、私有方法、例項構造器、父類方法,這類方法的呼叫過程稱為解析。這類方法叫做非虛方法,其他方法叫做虛方法,除了final方法,因為final方法不可以被覆蓋,所以也是非虛方法。
分派:
靜態分派:變數有靜態型別和例項型別,super a = new sub();super是a的靜態型別,sub是a的例項型別,區別靜態型別只有在使用時發生,變數本身的靜態型別不會發生變化,並且最終的靜態型別是編譯可知的。例項型別變化的結果在編譯器才可以確定。虛擬機器在過載的時候通過使用靜態型別而不是例項型別作為判斷依據的。靜態分派的典型應用就是方法過載,發生在編譯階段。
動態分派:方法的重寫,執行過程是invokevirtual:先找到運算元棧頂的第乙個元素所指向的例項型別,判斷與常量池中的描述符是否完全一致,否則對父類進行搜尋。
單分派與多分派:方法的接受著與方法的引數統稱為方法的宗量,靜態分派時首先需要判斷靜態型別,還需要引數,所以是多分派。動態分派因為只關心例項型別,並且方法簽名完全一致,包含了引數,所以是單分派。
未完待續.......
JVM 8 虛擬機器位元組碼執行引擎
在活動執行緒中,只有棧頂的棧時有效的,稱為當前棧幀,與這個棧幀相關聯的方法稱為當前方法。下面對棧幀的4個主要部分進行分析。存放方法引數和方法內部定義的區域性變數 一些細節 優點 可移植性 更加緊湊 編譯器實現更緊湊。確定就是速度更慢。指向執行時常量池中該棧幀所屬方法的引用,這個引用的為了支援方法呼叫...
虛擬機器位元組碼執行引擎
1.概述 虛擬機器 是乙個相對於 物理機 的概念,這兩種機器都有 執行能力,其區別是物理機的執行引擎是直接建立在處理器 硬體 指令集和作業系統層面上的,而虛擬機器的執行引擎是自己實現的,因此可以自行制定指令集與執行引擎的結構體系,並且能夠執行那些不被硬體直接支援的指令集格式。2.執行時棧幀結構 棧幀...
java 虛擬機器位元組碼執行引擎
一 執行時棧幀結構 棧幀分配多少記憶體,與執行時無關 1 區域性變數表 容量以slot 槽為單位 乙個slot 占用32位長度的記憶體空間,可以存的型別有boolean byte char short int float reference retuanaddress 二個slot 可以存long ...