今天來(lái)認(rèn)識(shí)下Java虛擬機(jī)的堆和棧吧瘤睹!


昨天有帶大家快速認(rèn)識(shí)了下Java虛擬機(jī),但你知道Java虛擬機(jī)的堆和棧嗎答倡?不清楚的小伙伴就快來(lái)看下吧轰传!

堆中分配的是對(duì)象,也就是new出來(lái)的東西苇羡;棧中分配的是基本類(lèi)型和自定義對(duì)象的引用绸吸。簡(jiǎn)單來(lái)理解呢鼻弧,堆是用來(lái)存放對(duì)象的设江,棧是用來(lái)運(yùn)行程序的。


關(guān)于運(yùn)行數(shù)據(jù)區(qū)的堆

堆是在運(yùn)行數(shù)據(jù)區(qū)劃分出來(lái)的一塊內(nèi)存區(qū)域攘轩,用于存儲(chǔ)在程序運(yùn)行過(guò)程中創(chuàng)建的對(duì)象實(shí)例和數(shù)組叉存,在虛擬機(jī)運(yùn)行的所有線程創(chuàng)建的對(duì)象實(shí)例和數(shù)組都共享一個(gè)堆。

堆中的存儲(chǔ)空間是有限的度帮,當(dāng)堆中存儲(chǔ)的對(duì)象實(shí)例超過(guò)堆的存儲(chǔ)空間時(shí)歼捏,堆就無(wú)法再存儲(chǔ)新的實(shí)例對(duì)象,在這種情況下就會(huì)造成堆的溢出笨篷,java程序也會(huì)拋出內(nèi)存溢出異常瞳秽。因此當(dāng)堆中的實(shí)例對(duì)象不再需要時(shí),應(yīng)及時(shí)回收空間率翅,回收的空間再分配給新的實(shí)例對(duì)象练俐。

那么,在什么情況下要對(duì)堆中的實(shí)例對(duì)象進(jìn)行回收呢冕臭?開(kāi)發(fā)者可以使用new運(yùn)算符在堆中創(chuàng)建實(shí)例對(duì)象腺晾,但不能釋放已創(chuàng)建的實(shí)例對(duì)象。其實(shí)開(kāi)發(fā)者不需要考慮如何回收實(shí)例對(duì)象占用的存儲(chǔ)空間辜贵,虛擬機(jī)的垃圾收集器(垃圾收集器在后面的課程會(huì)講到)會(huì)自動(dòng)回收不再被運(yùn)行的程序引用的對(duì)象所占用的存儲(chǔ)空間悯蝉。


關(guān)于運(yùn)行數(shù)據(jù)區(qū)的棧

棧是一個(gè)數(shù)據(jù)結(jié)構(gòu),棧結(jié)構(gòu)是一種特殊的線性表托慨,限定僅在表的一端進(jìn)行元素的插入和刪除鼻由。當(dāng)表中沒(méi)有元素時(shí),稱(chēng)為空棧。若給定棧:

S = (a1嗡靡,a2跺撼,……,an)

則稱(chēng)a1是棧底元素讨彼,an是棧頂元素歉井,表中元素按a1,a2哈误,……哩至,an的次序進(jìn)棧,出棧的順序是an蜜自,……菩貌,a2,a1重荠。也就是說(shuō)箭阶,棧結(jié)構(gòu)的元素訪問(wèn)原則是后進(jìn)先出,也稱(chēng)為后進(jìn)先出的線性表的戈鲁,如下圖所示:


棧也是在運(yùn)行數(shù)據(jù)區(qū)劃分出來(lái)的一塊內(nèi)存區(qū)域仇参,棧是和線程相關(guān)的,虛擬機(jī)會(huì)為每個(gè)線程分配一個(gè)棧婆殿,棧以幀為單位保存線程的運(yùn)行狀態(tài)诈乒,一個(gè)棧幀保存了Java方法的參數(shù)、局部變量婆芦、中間運(yùn)算結(jié)果怕磨、返回值等數(shù)據(jù)。棧幀由局部變量區(qū)消约、操作數(shù)棧和棧數(shù)據(jù)區(qū)構(gòu)成肠鲫。當(dāng)線程調(diào)用一個(gè)Java方法時(shí),虛擬機(jī)會(huì)從方法所在的類(lèi)信息中得知此方法的局部變量區(qū)和操作數(shù)棧的大小或粮,并給棧幀分配內(nèi)存导饲,將棧幀壓入棧中。

每當(dāng)線程調(diào)用一個(gè)方法時(shí)被啼,虛擬機(jī)都會(huì)在該線程的棧中壓入一個(gè)棧幀帜消,這個(gè)棧幀為當(dāng)前棧幀。Java方法有兩種返回方式:一種是方法運(yùn)行完成后浓体,以return方式返回泡挺;一種是在方法運(yùn)行過(guò)程中,發(fā)生錯(cuò)誤拋出異常命浴,非正常返回娄猫。不管以哪種方式返回贱除,虛擬機(jī)都會(huì)將當(dāng)前棧幀彈出并釋放掉,這樣上一個(gè)方法的棧幀就成為當(dāng)前棧幀了媳溺。


堆和棧的關(guān)系

堆是存儲(chǔ)實(shí)例對(duì)象和數(shù)組的內(nèi)存區(qū)域月幌,棧是存儲(chǔ)線程內(nèi)類(lèi)方法運(yùn)行狀態(tài)的內(nèi)存區(qū)域。當(dāng)線程調(diào)用類(lèi)方法時(shí)悬蔽,與方法有關(guān)的類(lèi)變量和方法內(nèi)部的局部變量都會(huì)存儲(chǔ)到棧幀扯躺,當(dāng)這些類(lèi)變量和局部變量是對(duì)象引用變量時(shí),這些變量會(huì)指向堆中的實(shí)例對(duì)象或數(shù)組蝎困,方法執(zhí)行完成后录语,與方法相關(guān)的棧幀被彈出棧,棧幀占用的存儲(chǔ)空間被釋放禾乘,但堆中的實(shí)例對(duì)象或數(shù)組并沒(méi)有釋放澎埠,它們由垃圾收集器在隨后的時(shí)間進(jìn)行釋放。


想要架構(gòu)師資料的私聊我


好了始藕,以上就是給大家分享的關(guān)于Java虛擬機(jī)的堆和棧的解答了蒲稳,希望能給大家?guī)?lái)一定的幫助!

有問(wèn)題可以在下方評(píng)論區(qū)討論或者找我私聊哦~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末伍派,一起剝皮案震驚了整個(gè)濱河市江耀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拙已,老刑警劉巖决记,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摧冀,死亡現(xiàn)場(chǎng)離奇詭異倍踪,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)索昂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)建车,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人椒惨,你說(shuō)我怎么就攤上這事缤至。” “怎么了康谆?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵领斥,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我沃暗,道長(zhǎng)月洛,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任孽锥,我火速辦了婚禮嚼黔,結(jié)果婚禮上细层,老公的妹妹穿的比我還像新娘。我一直安慰自己唬涧,他們只是感情好疫赎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著碎节,像睡著了一般捧搞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狮荔,一...
    開(kāi)封第一講書(shū)人閱讀 51,590評(píng)論 1 305
  • 那天实牡,我揣著相機(jī)與錄音,去河邊找鬼轴合。 笑死创坞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的受葛。 我是一名探鬼主播题涨,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼总滩!你這毒婦竟也來(lái)了纲堵?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤闰渔,失蹤者是張志新(化名)和其女友劉穎席函,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體冈涧,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡茂附,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了督弓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片营曼。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖愚隧,靈堂內(nèi)的尸體忽然破棺而出蒂阱,到底是詐尸還是另有隱情,我是刑警寧澤狂塘,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布录煤,位于F島的核電站,受9級(jí)特大地震影響荞胡,放射性物質(zhì)發(fā)生泄漏妈踊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一硝训、第九天 我趴在偏房一處隱蔽的房頂上張望响委。 院中可真熱鬧新思,春花似錦、人聲如沸赘风。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)邀窃。三九已至荸哟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瞬捕,已是汗流浹背鞍历。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肪虎,地道東北人劣砍。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像扇救,于是被迫代替她去往敵國(guó)和親刑枝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

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

  • 第6章類(lèi)文件結(jié)構(gòu) 6.1 概述 6.2 無(wú)關(guān)性基石 6.3 Class類(lèi)文件的結(jié)構(gòu) java虛擬機(jī)不和包括java...
    kennethan閱讀 934評(píng)論 0 2
  • 第二部分 自動(dòng)內(nèi)存管理機(jī)制 第二章 java內(nèi)存異常與內(nèi)存溢出異常 運(yùn)行數(shù)據(jù)區(qū)域 程序計(jì)數(shù)器:當(dāng)前線程所執(zhí)行的字節(jié)...
    小明oh閱讀 1,164評(píng)論 0 2
  • 一:java概述:1迅腔,JDK:Java Development Kit装畅,java的開(kāi)發(fā)和運(yùn)行環(huán)境,java的開(kāi)發(fā)工...
    ZaneInTheSun閱讀 2,653評(píng)論 0 11
  • 一沧烈、運(yùn)行時(shí)數(shù)據(jù)區(qū)域 Java虛擬機(jī)管理的內(nèi)存包括幾個(gè)運(yùn)行時(shí)數(shù)據(jù)內(nèi)存:方法區(qū)掠兄、虛擬機(jī)棧、本地方法棧锌雀、堆蚂夕、程序計(jì)數(shù)器,...
    加油小杜閱讀 1,519評(píng)論 1 15
  • JAVA虛擬機(jī)的生命周期 一個(gè)運(yùn)行時(shí)的Java虛擬機(jī)實(shí)例的天職是:負(fù)責(zé)運(yùn)行一個(gè)java程序汤锨。當(dāng)啟動(dòng)一個(gè)Java程序...
    Solang閱讀 1,174評(píng)論 0 19