大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國(guó)咨詢/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁(yè) hot資訊 Java虛擬機(jī)棧是什么

Java虛擬機(jī)棧是什么

更新時(shí)間:2021-05-17 11:13:18 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽922次

何為虛擬機(jī)棧

虛擬機(jī)棧的棧元素是棧幀,當(dāng)有一個(gè)方法被調(diào)用時(shí),代表這個(gè)方法的棧幀入棧;當(dāng)這個(gè)方法返回時(shí),其棧幀出棧。因此,虛擬機(jī)棧中棧幀的入棧順序就是方法調(diào)用順序。什么是棧幀呢?棧幀可以理解為一個(gè)方法的運(yùn)行空間。它主要由兩部分構(gòu)成,一部分是局部變量表,方法中定義的局部變量以及方法的參數(shù)就存放在這張表中;另一部分是操作數(shù)棧,用來(lái)存放操作數(shù)。我們知道,Java 程序編譯之后就變成了一條條字節(jié)碼指令,其形式類似匯編,但和匯編有不同之處:匯編指令的操作數(shù)存放在數(shù)據(jù)段和寄存器中,可通過(guò)存儲(chǔ)器或寄存器尋址找到需要的操作數(shù);而 Java 字節(jié)碼指令的操作數(shù)存放在操作數(shù)棧中,當(dāng)執(zhí)行某條帶 n 個(gè)操作數(shù)的指令時(shí),就從棧頂取 n 個(gè)操作數(shù),然后把指令的計(jì)算結(jié)果(如果有的話)入棧。因此,當(dāng)我們說(shuō) JVM 執(zhí)行引擎是基于棧的時(shí)候,其中的“棧”指的就是操作數(shù)棧。舉個(gè)簡(jiǎn)單的例子對(duì)比下匯編指令和 Java 字節(jié)碼指令的執(zhí)行過(guò)程,比如計(jì)算 1 + 2,在匯編指令是這樣的:

mov ax, 1 ;把 1 放入寄存器 ax add ax, 2 ;用 ax 的內(nèi)容和 2 相加后存入 ax

而 JVM 的字節(jié)碼指令是這樣的:

iconst_1 //把整數(shù) 1 壓入操作數(shù)棧 iconst_2 //把整數(shù) 2 壓入操作數(shù)棧 iadd //棧頂?shù)膬蓚€(gè)數(shù)相加后出棧,結(jié)果入棧

由于操作數(shù)棧是內(nèi)存空間,所以字節(jié)碼指令不必?fù)?dān)心不同機(jī)器上寄存器以及機(jī)器指令的差別,從而做到了平臺(tái)無(wú)關(guān)。

注意,局部變量表中的變量不可直接使用,如需使用必須通過(guò)相關(guān)指令將其加載至操作數(shù)棧中作為操作數(shù)使用。比如有一個(gè)方法 void foo(),其中的代碼為:int a = 1 + 2; int b = a + 3;,編譯為字節(jié)碼指令就是這樣的:

iconst_1 //把整數(shù) 1 壓入操作數(shù)棧 iconst_2 //把整數(shù) 2 壓入操作數(shù)棧 iadd //棧頂?shù)膬蓚€(gè)數(shù)出棧后相加,結(jié)果入棧;實(shí)際上前三步會(huì)被編譯器優(yōu)化為:iconst_3 istore_1 //把棧頂?shù)膬?nèi)容放入局部變量表中索引為 1 的 slot 中,也就是 a 對(duì)應(yīng)的空間中 iload_1 // 把局部變量表索引為 1 的 slot 中存放的變量值(3)加載至操作數(shù)棧 iconst_3 iadd //棧頂?shù)膬蓚€(gè)數(shù)出棧后相加,結(jié)果入棧 istore_2 // 把棧頂?shù)膬?nèi)容放入局部變量表中索引為 2 的 slot 中,也就是 b 對(duì)應(yīng)的空間中 return // 方法返回指令,回到調(diào)用點(diǎn)

需要說(shuō)明的是,局部變量表以及操作數(shù)棧的容量的最大值在編譯時(shí)就已經(jīng)確定了,運(yùn)行時(shí)不會(huì)改變。并且局部變量表的空間是可以復(fù)用的,例如,當(dāng)指令的位置超出了局部變量表中某個(gè)變量 a 的作用域時(shí),如果有新的局部變量 b 要被定義,b 就會(huì)覆蓋 a 在局部變量表的空間。

盜用別人的圖以讓大家對(duì)虛擬機(jī)棧有個(gè)直觀的認(rèn)識(shí)(其中小字體 Stack 指的的是虛擬機(jī)棧,F(xiàn)rame 是棧幀,Local variables 是局部變量表,Operand Stack 是操作數(shù)棧):

Java虛擬機(jī)棧是什么

以上就是動(dòng)力節(jié)點(diǎn)小編介紹的"Java虛擬機(jī)棧是什么",希望對(duì)大家有幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為您服務(wù)。

提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 久久美女性网 | 在线激情网址 | 操碰在线视频 | 四虎精品在线 | 欧美成人aⅴ | 好吊788gaoco| 色综合久久久久久久 | 亚洲91色| 国产精品免费看久久久 | 免费一级a毛片免费观看欧美大片 | 欧美韩一级片 | 精品动漫中文字幕一区二区三区 | 国产精品高清在线观看93 | 免费观看a级完整视频 | 久久99久久| 五月花精品视频在线观看 | 在线观看亚洲成人 | 成人欧美一区二区三区黑人 | 中文字幕精品一区 | 色婷婷免费视频 | 美国美女一级毛片免费全 | 青青久在线视频免费视频 | 印度最a级毛片 | 成人一区二区免费中文字幕 | 青青青青久久国产片免费精品 | 99成人在线视频 | 国产高清在线精品一区a | 4虎成人 | 免费夜色污私人影院网站 | 精品国偷自产在线 | 伊人成人久久 | 日韩欧美高清 | 免费看黄色的网站 | 亚洲国产欧美在线人成 | 亚洲成人在线免费 | 男女污污视频在线观看 | 久久中文字幕综合婷婷 | 美国毛片一级e片黑人片 | a毛片毛费观看 | 久久久久久久国产精品视频 | 欧美xxxx喷潮 |