執(zhí)行引擎是Java虛擬機(jī)最核心的組成部分之一。
物理機(jī)的執(zhí)行引擎是直接建立在處理器、硬件袭灯、指令集和操作系統(tǒng)層面上的,而虛擬機(jī)的執(zhí)行引擎則是由自己實(shí)現(xiàn)的绑嘹,因此可以自行制定指令集與執(zhí)行引擎的結(jié)構(gòu)體系稽荧,并且能夠執(zhí)行那些不被硬件直接支持的指令集格式。
在不同的虛擬機(jī)實(shí)現(xiàn)里面工腋,執(zhí)行引擎在執(zhí)行Java代碼的時(shí)候可能會(huì)有解釋執(zhí)行和編譯執(zhí)行兩種選擇姨丈,也可能兩者兼?zhèn)涑┳浚踔吝€可能會(huì)包含幾個(gè)不同級(jí)別的編譯器執(zhí)行引擎。
棧幀
棧幀是用于支持虛擬機(jī)進(jìn)行方法調(diào)用和方法執(zhí)行的數(shù)據(jù)結(jié)構(gòu)蟋恬,它是虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)中的虛擬機(jī)棧的棧元素翁潘。
棧幀存儲(chǔ)了方法的局部變量表,操作數(shù)棧歼争,動(dòng)態(tài)鏈接和方法返回地址等信息拜马。每一個(gè)方法從調(diào)用開(kāi)始至執(zhí)行完成的過(guò)程,都對(duì)應(yīng)著一個(gè)棧幀在虛擬機(jī)棧里面從入棧到出棧的過(guò)程沐绒。
在編譯期間俩莽,棧幀中需要多大的局部變量表,多深的操作數(shù)棧都已經(jīng)完全確定了乔遮,并且寫(xiě)入到方法表的Code屬性之中豹绪,因此 一個(gè)棧幀需要分配多少內(nèi)存,不會(huì)受到程序運(yùn)行期變量數(shù)據(jù)的影響申眼,而僅僅取決于具體的虛擬機(jī)實(shí)現(xiàn)瞒津。
局部變量表
局部變量表是一組變量值存儲(chǔ)空間,用于存儲(chǔ)方法參數(shù)和方法內(nèi)部定義的局部變量括尸。
局部變量表的容量以變量槽位最小單位巷蚪,虛擬機(jī)規(guī)范里面并沒(méi)有明確指明一個(gè)Slot應(yīng)占用的內(nèi)存空間大小,它允許Slot的長(zhǎng)度可以隨著處理器濒翻、操作系統(tǒng)或虛擬機(jī)的不同而發(fā)生變化屁柏。
類(lèi)變量有兩次賦初始化值得過(guò)程,一次是在準(zhǔn)備階段有送,賦予系統(tǒng)初始值淌喻;另外一次是在初始化階段,賦予程序員定義得初始化值雀摘。因此裸删,即使在初始化