虛擬機(jī)棧與本地方法棧

什么是棧

棧是一種先進(jìn)后出(FILO)的數(shù)據(jù)結(jié)構(gòu)喊递,就像槍的彈夾一樣寞埠,先壓進(jìn)去的子彈是最后打出來(lái)的科平,一般稱之為棧底,而位于“彈夾”最頂端的被稱為棧頂桌肴。

虛擬機(jī)棧解釋

顧名思義虛擬機(jī)棧是JVM中的棧數(shù)據(jù)結(jié)構(gòu),此種數(shù)據(jù)結(jié)構(gòu)是基于線程的宗收,創(chuàng)建了一個(gè)線程就相當(dāng)于創(chuàng)建了一個(gè)虛擬機(jī)棧一汽,例如我們最熟悉的main方法啟動(dòng),就啟動(dòng)了一個(gè)虛擬機(jī)棧碳锈。在線程運(yùn)行的過(guò)程中顽冶,數(shù)據(jù)或者引用被加載到棧中,各種數(shù)據(jù)或者引用會(huì)頻繁的入棧出棧售碳,等到線程消亡强重,虛擬機(jī)棧也跟著被釋放。

虛擬機(jī)棧的大小缺省值為1M贸人,可以用JVM參數(shù)-Xss調(diào)整大小
參考官方文檔: https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
搜索:-Xss

-Xss

可以發(fā)現(xiàn)不同平臺(tái)的缺省值也不同间景,總的來(lái)說(shuō),32位的操作系統(tǒng)對(duì)應(yīng)的是320KB艺智,64位的對(duì)應(yīng)的是1024KB

棧幀

Java中每個(gè)方法都會(huì)創(chuàng)建一個(gè)棧幀(Stack Frame)倘要,棧幀就是虛擬機(jī)棧的子彈,先創(chuàng)建的先被壓入棧十拣,然后調(diào)用別的方法的時(shí)候又壓入一個(gè)封拧。
例如代碼:

public class StackFrameDemo {

    public static void main(String[] args) {
        System.out.println(work());
    }

    public static int work(){
        int a = 1;
        int b = 1;
        int c = a + b;
        return c;
    }

}

運(yùn)行main方法時(shí)
一個(gè)main方法啟動(dòng)創(chuàng)建了一個(gè)虛擬機(jī)棧,此時(shí)虛擬機(jī)棧中是這樣的:


main stackFrame

當(dāng)我們調(diào)用work方法的時(shí)候:


work stackFrame

等到work()方法執(zhí)行完夭问,就出棧哮缺,然后main方法出棧,出棧的操作可以看做把子彈射出去甲喝,虛擬機(jī)棧里就沒(méi)了尝苇。

棧幀詳解

棧幀的結(jié)構(gòu)


Stack Frame
棧幀結(jié)構(gòu)

一個(gè)棧幀需要分配多少內(nèi)存,不會(huì)受到程序運(yùn)行時(shí)變量數(shù)據(jù)影響埠胖,僅僅取決于虛擬機(jī)的實(shí)現(xiàn)

局部變量表(Local Variable Table)
  • 在編譯代碼的時(shí)候就可以確定棧幀需要多大的局部表量表糠溜,具體的大小可以再編譯后的Class文件中看到
  • 局部變量表容量以變量槽(Variable Slot)為最小單位,每個(gè)變量槽都可以存儲(chǔ)32位長(zhǎng)度的內(nèi)存空間
  • 在方法執(zhí)行的時(shí)候直撤,虛擬機(jī)使用局部變量表完成參數(shù)值到參數(shù)變量表的傳遞過(guò)程非竿,如果執(zhí)行的是實(shí)例方法,那局部表量表的第0個(gè)槽位索引默認(rèn)是用于傳遞方法所屬對(duì)象的引用(this關(guān)鍵字)
  • 其余參數(shù)則按照參數(shù)順序排列谋竖,占用從1開始的局部變量表Slot
  • 基本數(shù)據(jù)類型以及引用和返回地址(returnAddress)占用一個(gè)變量槽红柱,long和double占兩個(gè)
操作數(shù)棧(Operand Stack)
  • 也是在編譯期間就可以確定大小
  • 棧幀(Frame)被創(chuàng)建時(shí)承匣,操作數(shù)棧是空的。操作數(shù)棧的每個(gè)定都可以存放JVM各種類型的數(shù)據(jù)锤悄,long和double則占兩個(gè)棧深(和局部變量表是一樣的韧骗,因?yàn)閘ong、double都是64位的數(shù)據(jù))
  • 方法執(zhí)行的過(guò)程中零聚,隨著各個(gè)指令的執(zhí)行袍暴,會(huì)有各種數(shù)據(jù)往操作數(shù)棧中寫入和讀取,也就是出棧和入棧操作
  • 操作數(shù)棧調(diào)用其他有返回結(jié)果的方法時(shí)隶症,會(huì)把結(jié)果push到棧上(通過(guò)操作數(shù)棧進(jìn)行參數(shù)傳遞)
動(dòng)態(tài)鏈接(Dynamic Linking)
  • 動(dòng)態(tài)鏈接涉及到j(luò)ava的多態(tài)特性政模,動(dòng)態(tài)鏈接的說(shuō)明是棧幀內(nèi)部包含一個(gè)指向運(yùn)行時(shí)常量池中該棧幀所屬方法的引用,該引用的目的是為了支持動(dòng)態(tài)代理
完成出口(也叫返回地址 Return Address)
  • 方法執(zhí)行完成的出口蚂会,只能由2種方式可以退出:return 返回指令淋样,異常退出
  • 正常退出的流程是,將調(diào)用方法的返回值(如果有的話)胁住,壓入被調(diào)用方法的操作數(shù)棧頂习蓬,被調(diào)用的方法根據(jù)程序計(jì)數(shù)器繼續(xù)執(zhí)行

通過(guò)字節(jié)碼,查看方法執(zhí)行時(shí)棧幀中的各個(gè)數(shù)據(jù)

  1. 打開類所在的文件夾措嵌,通過(guò)javac 指令編譯java文件為class字節(jié)碼文件


    javac
  2. 在通過(guò)javap -c 查看反匯編字節(jié)碼,如果有中文用 javac -encoding UTF-8 XXX.java
    work()方法部分的字節(jié)碼為

  public static int work();
    Code:
       0: iconst_1      加載一個(gè)常量1到操作數(shù)棧    
       1: istore_0       將一個(gè)數(shù)值從操作數(shù)棧加載到局部變量表0的slot
       2: iconst_1      加載一個(gè)常量1到操作數(shù)棧
       3: istore_1      將一個(gè)數(shù)值從操作數(shù)棧加載到局部變量表1的slot
       4: iload_0        將局部變量表0位置的數(shù)值加載到操作數(shù)棧
       5: iload_1        將局部變量表1位置的數(shù)值加載到操作數(shù)棧
       6: iadd             加法指令
       7: istore_2      將一個(gè)數(shù)值從操作數(shù)棧加載到局部變量表2的slot
       8: iload_2       將局表變量表位置為2的數(shù)值加載到操作數(shù)棧
       9: ireturn       返回躲叼,將操作數(shù)棧頂?shù)姆祷刂祲喝雖ain方法的操作數(shù)棧頂

關(guān)于字節(jié)碼指令的解釋參考博客:https://cloud.tencent.com/developer/article/1333540

用圖形時(shí)間軸看起來(lái)更加明了


time

這就是work方法執(zhí)行時(shí),內(nèi)存中數(shù)據(jù)的變化企巢。

本地方法棧

與虛擬機(jī)棧類似枫慷,只不過(guò),虛擬機(jī)棧用于管理Java方法的調(diào)用浪规。而本地方法棧則用于管理native方法(例如Thread.start0())的調(diào)用或听,由于native方法不是用Java實(shí)現(xiàn)的,而是由C語(yǔ)言實(shí)現(xiàn)的笋婿。事實(shí)上虛擬機(jī)棧和本地方法棧的區(qū)域是非常類似的誉裆,在Hotspot中直接把本地方法棧和虛擬機(jī)棧合二為一,放在了一個(gè)區(qū)域之中缸濒。當(dāng)然他們本質(zhì)上的是兩個(gè)東西足丢。

參考博客https://www.cnblogs.com/jhxxb/p/11001238.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市庇配,隨后出現(xiàn)的幾起案子斩跌,更是在濱河造成了極大的恐慌,老刑警劉巖捞慌,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耀鸦,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡啸澡,警方通過(guò)查閱死者的電腦和手機(jī)袖订,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門氮帐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人洛姑,你說(shuō)我怎么就攤上這事上沐。” “怎么了吏口?”我有些...
    開封第一講書人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵奄容,是天一觀的道長(zhǎng)冰更。 經(jīng)常有香客問(wèn)我产徊,道長(zhǎng),這世上最難降的妖魔是什么蜀细? 我笑而不...
    開封第一講書人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任舟铜,我火速辦了婚禮,結(jié)果婚禮上奠衔,老公的妹妹穿的比我還像新娘谆刨。我一直安慰自己,他們只是感情好归斤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開白布痊夭。 她就那樣靜靜地躺著,像睡著了一般脏里。 火紅的嫁衣襯著肌膚如雪她我。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,610評(píng)論 1 305
  • 那天迫横,我揣著相機(jī)與錄音番舆,去河邊找鬼。 笑死矾踱,一個(gè)胖子當(dāng)著我的面吹牛恨狈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播呛讲,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼禾怠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了贝搁?” 一聲冷哼從身側(cè)響起刃宵,我...
    開封第一講書人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎徘公,沒(méi)想到半個(gè)月后牲证,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡关面,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年坦袍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了十厢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡捂齐,死狀恐怖蛮放,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情奠宜,我是刑警寧澤包颁,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站压真,受9級(jí)特大地震影響娩嚼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜滴肿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一岳悟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧泼差,春花似錦贵少、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至吼肥,卻和暖如春录平,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背潜沦。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工萄涯, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人唆鸡。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓涝影,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親争占。 傳聞我的和親對(duì)象是個(gè)殘疾皇子燃逻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355

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