執(zhí)行引擎,是Java虛擬機最核心的組成部分之一,執(zhí)行引擎在執(zhí)行代碼時可能是編譯執(zhí)行吓揪,也可能是解釋執(zhí)行,也可能兩者兼?zhèn)渌啤5械膱?zhí)行引擎都是輸入的是字節(jié)碼文件柠辞,處理過程是字節(jié)碼解析的等效過程,輸出的是執(zhí)行結(jié)果
1. 運行時棧幀結(jié)構(gòu)
棧幀主胧,是用于支持虛擬機進行方法調(diào)用和方法執(zhí)行的數(shù)據(jù)結(jié)構(gòu)叭首,它是虛擬機運行時數(shù)據(jù)區(qū)中的虛擬機棧的棧元素。棧幀儲存了局部變量表踪栋,操作數(shù)棧焙格,動態(tài)鏈接和方法返回地址等信息
- 編譯期就已經(jīng)確定了棧幀的局部變量表的大小和操作數(shù)棧的深度
- 當(dāng)前棧幀:對于執(zhí)行引擎來講,活動線程中夷都,只有棧頂?shù)臈怯行У?/li>
- 當(dāng)前方法:當(dāng)前棧幀關(guān)聯(lián)的方法
1.1 局部變量表
變量值存儲空間眷唉,用于存放方法參數(shù)和方法內(nèi)部定義的局部變量
- 以變量槽(Slot)為最小單位
- 使用局部變量表完成參數(shù)值到參數(shù)變量列表的傳遞過程的
- 如果是實例方法,局部變量表的第0位索引的Slot默認(rèn)是用于傳遞方法所屬對象實例的引用
- 一個局部變量可以保存一個類型為boolean囤官、byte冬阳、char、short党饮、int肝陪、float、reference和returnAddress類型的數(shù)據(jù)
- 如果Slot是32位的劫谅,則遇到一個64位數(shù)據(jù)類型的變量(如long或double型)见坑,則會連續(xù)使用兩個連續(xù)的Slot來存儲嚷掠。
- Slot的復(fù)用
java棧之局部變量表
1.2 操作數(shù)棧
- 最大深度在code屬性中的
max_stack
數(shù)據(jù)項中 - 一開始操作數(shù)棧是空的,在方法執(zhí)行過程中荞驴,會有各種字節(jié)碼指令向操作數(shù)棧寫入和提取內(nèi)容
- 概念模型中不皆,操作數(shù)棧是相互獨立的,但實際上的棧幀會出現(xiàn)一部分重疊熊楼,這樣在調(diào)用時就可以共用一部分?jǐn)?shù)據(jù)
- “基于棧的執(zhí)行引擎”霹娄,其中的棧就是操作數(shù)棧
1.3 動態(tài)鏈接
每個棧幀都包含一個指向運行時常量池中該棧幀索樹方法的引用,持有這個引用是為了支持方法調(diào)用過程中的動態(tài)連接
- 常量池中存在大量的符號引用鲫骗,這些符號引用一部分會在類加載階段或第一次使用時轉(zhuǎn)化為直接引用犬耻,稱為靜態(tài)解析,還有一部分在運行期間轉(zhuǎn)化為直接引用执泰,稱為動態(tài)解析
1.4 方法返回地址
退出可能的操作:
- 恢復(fù)上層方法的局部變量表和操作數(shù)棧
- 把返回值壓入調(diào)用者棧幀的操作數(shù)棧中
- 調(diào)整PC計數(shù)器的值以指向方法調(diào)用指令后面的一條指令等
1.5 附加信息
2. 方法調(diào)用
方法調(diào)用不等同于方法執(zhí)行枕磁,它的唯一任務(wù)就是確定被調(diào)用方法的版本,不涉及運行過程
- Class文件的編譯過程不涉及傳統(tǒng)編譯過程的連接步驟术吝,一切方法調(diào)用在CLass文件里面存儲的都只是符號引用计济,而不是直接引用,這個特性給Java帶來了很強的動態(tài)擴展能力
2.1 解析
- 特點:是靜態(tài)過程排苍;在編譯期間就完全確定沦寂,在類裝載的解析階段就會把涉及的符號引用全部轉(zhuǎn)變?yōu)榭纱_定的直接引用,而不會延遲到運行期再去完成淘衙,即編譯期可知传藏、運行期不可變
- 適用對象:靜態(tài)方法(與類型直接關(guān)聯(lián))、私有方法(在外部不可被訪問)彤守,它們都不可能通過繼承或其他方式重寫其他版本
2.2 分派
- 靜態(tài)分派:依賴靜態(tài)類型來定位方法的執(zhí)行版本毯侦;典型應(yīng)用是方法重載;發(fā)生在編譯階段具垫,不由Java虛擬機來執(zhí)行
- 動態(tài)分派:依賴動態(tài)類型來定位方法的執(zhí)行版本叫惊;典型應(yīng)用是方法重寫;發(fā)生在運行階段做修,由Java虛擬機來執(zhí)行
- 單分派:根據(jù)一個宗量對目標(biāo)方法進行選擇(方法的接受者與方法的參數(shù)統(tǒng)稱為方法的宗量)
- 多分派:根據(jù)多于一個宗量對目標(biāo)方法進行選擇