pc網(wǎng)站設(shè)計哪家公司好中山網(wǎng)站建設(shè)公司
第8章 虛擬機字節(jié)碼執(zhí)行引擎
8.1 概述
解釋執(zhí)行,編譯執(zhí)行,或混合執(zhí)行
8.2 運行時棧幀結(jié)構(gòu)
一個方法對應(yīng)一個棧幀,一個方法的出入棧代表運行情況。
程序的字節(jié)碼指令只針對于當前棧幀生效。
棧占用的內(nèi)存在運行前便已確定。
8.2.1 局部變量表
存儲局部變量與方法參數(shù)
8.2.2 操作數(shù)棧
各種字節(jié)碼指令在運行時在棧中出入棧來實現(xiàn)運算。
兩個棧幀會互享一部分數(shù)據(jù)(調(diào)用時局部變量為調(diào)用方法的參數(shù)等
8.2.3 動態(tài)連接
略
8.2.4 方法返回地址
正常退出后將返回值傳給調(diào)用棧幀即可
異常退出無返回值,且當前線程停止運行
8.3 方法調(diào)用
8.3.1 解析
類加載時可解析確定唯一版本的方法:
1>靜態(tài)方法
2>構(gòu)造方法
3>私有方法
4>父類方法
5>final方法
8.3.2 分派
1>靜態(tài)分派
Human【靜態(tài)類型】 hm = x > y ? new Man() : new Woman()【實際類型】;
【一個對象的靜態(tài)類型是編譯期可知的,而實際類型在運行期間才可知曉】
【方法重載時通過靜態(tài)類型確定調(diào)用方法(編譯器可確定)】
【確定重載方法會自動轉(zhuǎn)換,直到找不到為止】
轉(zhuǎn)換順序:char > int > long > float > double > 接口 > 父類(由下到上)
2>動態(tài)分派
方法重寫由實際類型確定
字段不具有多態(tài)性,只會使用當前類的,沒有才會找父類的,但子類覆蓋父類。
直接在外部調(diào)用字段根據(jù)靜態(tài)類型調(diào)用。
3>單分派與多分派
Java是靜態(tài)多分派,動態(tài)但分派的。
【單分派與多分派區(qū)別是分派時的宗量數(shù)。
宗量:方法接收者(this)與參數(shù)】
4>虛擬機動態(tài)分派的實現(xiàn)
通過建立虛方法表來減少搜索元數(shù)據(jù),子類未重寫的父類方法在虛方發(fā)表中的入口為父類入口地址,重寫過即為子類入口地址。
8.4 動態(tài)類型語言支持
8.4.1 動態(tài)類型語言
無靜態(tài)類型,只有實際類型
8.4.2 Java與動態(tài)類型
JVM原本不太支持動態(tài)類型
8.4.3 java.lang.invoke包
可以動態(tài)調(diào)用方法(字節(jié)碼層面)
8.4.4 invokedynamic指令
略
8.5 基于棧的字節(jié)碼解釋執(zhí)行引擎
8.5.1 解釋執(zhí)行
JVM處理字節(jié)碼(編譯器輸出)
8.5.2 基于棧的指令集與基于寄存器的指令集
棧運行速度不如寄存器,但代碼緊湊,編譯器實現(xiàn)簡單。
解釋運行時,因有大量出入棧操作,導(dǎo)致棧指令運行慢,但即時編譯后的匯編指令便沒有這種問題了。
8.5.3 基于棧的解釋器執(zhí)行過程
略【虛擬機執(zhí)行時會對執(zhí)行過程做一系列優(yōu)化】