更新時(shí)間:2020-07-03 15:02:00 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽2345次
堆棧,這個(gè)名詞很多Java開(kāi)發(fā)者在一開(kāi)始學(xué)習(xí)Java的時(shí)候就經(jīng)常聽(tīng)說(shuō)了。
對(duì)于這個(gè)名詞來(lái)說(shuō),它描述的其實(shí)是JVM的內(nèi)存模型,
如果面試中問(wèn)到,堆棧具體對(duì)應(yīng)著什么,不知道是否了解?
堆和棧
其實(shí)堆棧是兩個(gè)東西,在JVM中分別對(duì)應(yīng)兩個(gè)不同的內(nèi)存部分。
對(duì)于JVM內(nèi)存模型來(lái)說(shuō),只要記住下面這張圖就足夠了,
對(duì)于左邊黃色的部分,就是JVM中的“堆”,相對(duì)應(yīng)的右邊的則是"棧"。
堆
在Java中,Heap用來(lái)表示堆。我們不作深入的研究,畢竟JVM是個(gè)龐大復(fù)雜的東西,
這里只基本介紹JVM的基礎(chǔ)知識(shí)部分。
比如Heap是用來(lái)干啥的?
提示一下,平時(shí)經(jīng)常實(shí)例化對(duì)象吧?
Student student=new Student();
這里實(shí)例化了的對(duì)象,就是存放在堆中。
具體的說(shuō),是存放在Heap Memory中。
還有,靜態(tài)變量也是在這里,還記得上面那張圖嘛,黃色部分分了上下兩個(gè)區(qū),
其中一個(gè)叫Method Area的區(qū)域,是用來(lái)存放靜態(tài)變量的。
棧
你應(yīng)該知道大名鼎鼎的爆棧吧,StackOverFlow,
這個(gè)網(wǎng)站可能解決了平時(shí)我們開(kāi)發(fā)中遇到的90%的問(wèn)題。
其實(shí)stack over flow本身是一種異常,這里的stack說(shuō)的就是JVM里的棧。
而棧是用來(lái)干什么的呢,
舉個(gè)例子,平時(shí)我們寫(xiě)的非靜態(tài)方法,執(zhí)行時(shí)就在棧里。
雖然這么說(shuō)不夠準(zhǔn)確,因?yàn)橐f(shuō)明白方法的執(zhí)行,需要了解棧幀的概念,但我們這里不作深入的分析。
現(xiàn)在不知道你是否明白,之前見(jiàn)過(guò)的stack over flow異常是怎么回事。
如果足夠好奇的話(huà),
可以嘗試寫(xiě)一個(gè)遞歸方法,
public boolean recursive(){....return recursive();}
然后嘗試讓這個(gè)遞歸無(wú)限的嵌套下去,
你就會(huì)看到StackOverFlowException了,
原因就是因?yàn)閟tack內(nèi)存不足以運(yùn)行方法。
總結(jié)
所以總的來(lái)說(shuō),JVM分為Head和Stack兩個(gè)部分
對(duì)于初學(xué)者,只要初步了解了這個(gè)基礎(chǔ),基本能應(yīng)付開(kāi)發(fā)中遇到的問(wèn)題。
但如果想要提高自己,最終都需要深入了解JVM的內(nèi)存模型。
以上就是動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“Java高級(jí)課程之Java堆內(nèi)存和棧內(nèi)存的區(qū)別”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢(xún),有專(zhuān)業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話(huà)與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743