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