更新時(shí)間:2021-02-03 17:27:45 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1241次
在計(jì)算機(jī)領(lǐng)域,堆棧是一個(gè)不容忽視的概念,堆棧都是一種數(shù)據(jù)項(xiàng)按序排列的數(shù)據(jù)結(jié)構(gòu),只能在一端(稱為棧頂(top))對(duì)數(shù)據(jù)項(xiàng)進(jìn)行插入和刪除。在單片機(jī)應(yīng)用中,堆棧是個(gè)特殊的存儲(chǔ)區(qū),主要功能是暫時(shí)存放數(shù)據(jù)和地址,通常用來保護(hù)斷點(diǎn)和現(xiàn)場(chǎng)。堆棧的學(xué)習(xí)我們需要抓住核心問題,這樣我們才能以點(diǎn)帶面,學(xué)好整個(gè)堆棧。本文我們就來介紹4個(gè)Java堆棧核心問題。
1、在通常情況下由操作系統(tǒng)(OS)和語言的運(yùn)行時(shí)(runtime)控制嗎?
如前所述,堆和棧是一個(gè)統(tǒng)稱,可以有很多的實(shí)現(xiàn)方式。計(jì)算機(jī)程序通常有一個(gè)棧叫做調(diào)用棧,用來存儲(chǔ)當(dāng)前函數(shù)調(diào)用相關(guān)的信息(比如:主調(diào)函數(shù)的地址,局部變量),因?yàn)楹瘮?shù)調(diào)用之后需要返回給主調(diào)函數(shù)。棧通過擴(kuò)展和收縮來承載信息。實(shí)際上,程序不是由運(yùn)行時(shí)來控制的,它由編程語言、操作系統(tǒng)甚至是系統(tǒng)架構(gòu)來決定。 堆是在任何內(nèi)存中動(dòng)態(tài)和隨機(jī)分配的(內(nèi)存的)統(tǒng)稱;也就是無序的。內(nèi)存通常由操作系統(tǒng)分配,通過應(yīng)用程序調(diào)用 API 接口去實(shí)現(xiàn)分配。在管理動(dòng)態(tài)分配內(nèi)存上會(huì)有一些額外的開銷,不過這由操作系統(tǒng)來處理。
2、堆棧的作用范圍是什么?
調(diào)用棧是一個(gè)低層次的概念,就程序而言,它和“作用范圍”沒什么關(guān)系。如果你反匯編一些代碼,你就會(huì)看到指針引用堆棧部分。就高級(jí)語言而言,語言有它自己的范圍規(guī)則。一旦函數(shù)返回,函數(shù)中的局部變量會(huì)直接直接釋放。你的編程語言就是依據(jù)這個(gè)工作的。
在堆中,也很難去定義。作用范圍是由操作系統(tǒng)限定的,但是你的編程語言可能增加它自己的一些規(guī)則,去限定堆在應(yīng)用程序中的范圍。體系架構(gòu)和操作系統(tǒng)是使用虛擬地址的,然后由處理器翻譯到實(shí)際的物理地址中,還有頁(yè)面錯(cuò)誤等等。它們記錄那個(gè)頁(yè)面屬于那個(gè)應(yīng)用程序。不過你不用關(guān)心這些,因?yàn)槟銉H僅在你的編程語言中分配和釋放內(nèi)存,和一些錯(cuò)誤檢查(出現(xiàn)分配失敗和釋放失敗的原因)。
3、堆棧的大小由什么決定?
依舊,依賴于語言,編譯器,操作系統(tǒng)和架構(gòu)。棧通常提前分配好了,因?yàn)闂1仨毷沁B續(xù)的內(nèi)存塊。語言的編譯器或者操作系統(tǒng)決定它的大小。不要在棧上存儲(chǔ)大塊數(shù)據(jù),這樣可以保證有足夠的空間不會(huì)溢出,除非出現(xiàn)了無限遞歸的情況(額,棧溢出了)或者其它不常見了編程決議。
堆是任何可以動(dòng)態(tài)分配的內(nèi)存的統(tǒng)稱。這要看你怎么看待它了,它的大小是變動(dòng)的。在現(xiàn)代處理器中和操作系統(tǒng)的工作方式是高度抽象的,因此你在正常情況下不需要擔(dān)心它實(shí)際的大小,除非你必須要使用你還沒有分配的內(nèi)存或者已經(jīng)釋放了的內(nèi)存。
4、堆和棧哪個(gè)更快一些?
棧更快因?yàn)樗械目臻e內(nèi)存都是連續(xù)的,因此不需要對(duì)空閑內(nèi)存塊通過列表來維護(hù)。只是一個(gè)簡(jiǎn)單的指向當(dāng)前棧頂?shù)闹羔?。編譯器通常用一個(gè)專門的、快速的寄存器來實(shí)現(xiàn)。更重要的一點(diǎn)事是,隨后的棧上操作通常集中在一個(gè)內(nèi)存塊的附近,這樣的話有利于處理器的高速訪問。
以上就是關(guān)于4個(gè)Java堆棧核心問題的講解,棧是一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu),堆可以被看成是一棵樹,如:堆排序。在Java中,棧與堆都是Java用來在Ram中存放數(shù)據(jù)的地方,所以,堆棧在很多地方都有相似之處,這也是我們把堆和棧放在一起的原因。想要學(xué)好堆棧,光靠這幾個(gè)核心問題是遠(yuǎn)遠(yuǎn)不夠的,在本站的數(shù)據(jù)結(jié)構(gòu)和算法教程中有著堆棧的全面解析,感興趣的小伙伴可以前去學(xué)習(xí)。
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743