虛擬機字節(jié)碼執(zhí)行引擎

執(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)解析

JVM - 直接引用和符號引用

1.4 方法返回地址

退出可能的操作:

  1. 恢復(fù)上層方法的局部變量表和操作數(shù)棧
  2. 把返回值壓入調(diào)用者棧幀的操作數(shù)棧中
  3. 調(diào)整PC計數(shù)器的值以指向方法調(diào)用指令后面的一條指令等

談?wù)刯ava字符串常量池和符號引用

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)方法進行選擇
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市抡草,隨后出現(xiàn)的幾起案子饰及,更是在濱河造成了極大的恐慌,老刑警劉巖康震,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件燎含,死亡現(xiàn)場離奇詭異,居然都是意外死亡腿短,警方通過查閱死者的電腦和手機屏箍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門绘梦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赴魁,你說我怎么就攤上這事卸奉。” “怎么了颖御?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵榄棵,是天一觀的道長。 經(jīng)常有香客問我潘拱,道長疹鳄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任芦岂,我火速辦了婚禮瘪弓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘禽最。我一直安慰自己腺怯,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布弛随。 她就那樣靜靜地躺著瓢喉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪舀透。 梳的紋絲不亂的頭發(fā)上栓票,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音愕够,去河邊找鬼走贪。 笑死,一個胖子當(dāng)著我的面吹牛惑芭,可吹牛的內(nèi)容都是我干的坠狡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼遂跟,長吁一口氣:“原來是場噩夢啊……” “哼逃沿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起幻锁,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤凯亮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后哄尔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體假消,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年岭接,在試婚紗的時候發(fā)現(xiàn)自己被綠了富拗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片臼予。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖啃沪,靈堂內(nèi)的尸體忽然破棺而出粘拾,到底是詐尸還是另有隱情,我是刑警寧澤谅阿,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布半哟,位于F島的核電站,受9級特大地震影響签餐,放射性物質(zhì)發(fā)生泄漏寓涨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一氯檐、第九天 我趴在偏房一處隱蔽的房頂上張望戒良。 院中可真熱鬧,春花似錦冠摄、人聲如沸糯崎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至流纹,卻和暖如春拆挥,著一層夾襖步出監(jiān)牢的瞬間薄霜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工纸兔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留惰瓜,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓汉矿,卻偏偏與公主長得像崎坊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子洲拇,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容