stack vs heap:執行時期儲存兩大要角 - 劉逸的留意世界
文章推薦指數: 80 %
當資訊為動態配置產生,系統會存放在另外一塊空間,稱之為『Heap』(注意這裡的Heap跟資料結構中的Heap不相關,可別會錯意!)。
Heap的區塊專收執行期間動態 ...
劉逸的留意世界
跳到主文
紀錄IT、趨勢的點點滴滴
部落格全站分類:數位生活
相簿
部落格
留言
名片
Aug01Mon201111:42
stackvsheap:執行時期儲存兩大要角
現代電腦系統大多依照VonNeumannArchitecture設計而成,其中一特色storedprogramming乃指『程式執行一定要將欲執行的指令跟資料放入記憶體方可執行』,由此可知執行過程中記憶體所佔的地位厥偉之處。
但許多工程師卻搞不清楚記憶體中的stack跟heapspace到底有何居別,下面簡單針對兩者加以論述,希望對讀者有所幫助~
三分天下。
程式執行過程中其實主要分成三大區塊:global、stack、heap三塊。
其中global區塊最最易理解,主要存放全域變數或宣告為static的靜態變數在此就不多做贅述;另外兩個區塊分別為stack跟heap這兩者往往混淆不清,尤其在java中有時候會出現stackoverflow或heapoverflow到底兩者差異在哪,若工程師連這都不清楚那以後怎麼去調整JVM中的heapmemoryspace跟stackmemoryspace的大小呢?
貼心的系統全自動化管理區塊:StackMemorySpace!在記憶體中不外乎就是要存放變數、函式相關資訊等資料,使運作過程可以順利取得所需的變數或函式所在地。
要讓系統可以全自動化管理,代表需可被預期此變數或函數資訊的生命週期,一旦完全可預測代表可以安心的交由系統管理,這些資訊也將在執行過程中被存放在stack空間。
Stack中常見的存放資訊如下:區域變數(localvariable)、函式參數(function/methodparameter)、函數的返回位址(function/methodreturnaddress)等資訊。
為何上述資訊會放於stack之中,簡單來說:
voidmethod1(){
intx=100;
}
上述的intx=100,系統會在stack中找一個區塊給x,另外裡面的內容為100。
然而,x會被放入stack主要是因為在編譯時期系統已經可以預知x從何時開始配置跟何時結束回收(當然就是看所屬block結束就跟著回收),由於配置跟回收的規則明確,當然就往stack擺囉。
在舉一例子:
voidmethod2(){
method1();
}
上述當呼叫method1()時,系統會先把method2的返回位址存到stack當中,為何是存放在stack呢,因為函式的呼叫有後進先出的概念,當method1()被呼叫而開始執行,待結束時必定會查找該返回何處,故最後一定會讀取函式的返回位址,既然如此明確而有條理,當然也是往stack放!
可預測性外加後進先出的生存模式,令stack無疑是最佳的存放策略。
由於程式語言中變數跟函式的生命週期皆為後進先出的概念,也就是越晚產生的會越先被回收或銷毀。
正因如此只要是可預測性的相關資訊都是往stack存放。
此外,由於stack中的資料之存活週期規律故由系統自行產生與回收其空間即可,就不勞工程師們費心啦!
天啊!程式中竟然有不可預測其存活時間的資料存在。
在程式中,有部分的需求總是在執行中依據實際情況才會動態增減,這些資訊是難以被預測哪時候開始有?量有多少?何時該回收?…這些不可預測的因素造成上述的stack區塊不適合運用於此。
當資訊為動態配置產生,系統會存放在另外一塊空間,稱之為『Heap』(注意這裡的Heap跟資料結構中的Heap不相關,可別會錯意!)。
Heap的區塊專收執行期間動態產生的資料,由於為動態產生故結束點無法由系統來掌握,故需使用者自行回收空間。
在C++或Java中利用new語法產生的就是動態配置的物件,需存放於heap中。
奇怪跑越久記憶體用越多的怪現象。
許多時候執行的程式都沒有改變,但卻常出現隨時間執行越久程式所耗用的空間將越多,最後造成outofmemory。
工程師也不知為何如此,就是定期在outofmemory之前restart程式即可。
這中現象層出不窮,一般大多是因為工程師沒有正確將記憶體回收所導致。
Heap中的資料如果沒有正常的回收,將會逐步成長到將記憶體消耗殆盡,下次發生上述問題的實後,切記自己檢查一下heap空間的資料有無正常回收。
論述到此有些讀者可能會覺得納悶:為何在寫Java都不需要注意回收空間的問題?~答案是因為Java中會採用GarbageCollection(垃圾回收)的機制自動檢查Heap中哪些資料已經沒有被使用,當確認資料已經沒有使用會自動將空間回收,如此工程師就專注撰寫程式即可,不用擔心記憶體回收不當等問題。
Theconclusionis…。
當產生stackoverflow一般是因為過多的函式呼叫(例如:遞迴太深)、或區域變數使用太多,此時請試著將stacksize調大一點,另外檢查看看函式的呼叫跟變數的使用量。
反之,當發生heapoverflow請檢查是否都有正確將heapspace的資料回收,另外採行的動態配置是否合理,不要過渡濫用而new出無謂的空間,若真的是程式過於複雜造成,請將heapsize調大一些。
程式的撰寫,其實跟製造業的加工廠很相似,套句郭董常說的:『魔鬼藏在細節中』~~
全站熱搜
創作者介紹
劉逸
劉逸的留意世界
劉逸發表在痞客邦留言(16)人氣()
E-mail轉寄
全站分類:數位生活個人分類:臥龍論IT此分類上一篇:論物件導向part5:Polymorphism
此分類下一篇:論物件導向part6:abstractclass
上一篇:論物件導向part5:Polymorphism
下一篇:一直在想
▲top
留言列表
發表留言
我的好友
熱門文章
文章分類
臥龍邏輯思考力(19)臥龍論IT(87)臥龍雜記(93)臥龍點將錄(2)全文分享區(1)
最新文章
最新留言
文章精選
文章精選
2016五月(1)
2015九月(1)
2015五月(1)
2014十一月(2)
2014一月(3)
2013十二月(1)
2013十一月(1)
2013八月(2)
2013六月(5)
2013五月(3)
2013四月(5)
2013三月(8)
2013二月(9)
2013一月(5)
2012十二月(9)
2012十一月(7)
2012十月(11)
2012九月(11)
2012八月(15)
2012七月(18)
2012六月(14)
2012五月(6)
2012四月(2)
2012三月(5)
2012二月(5)
2012一月(2)
2011十二月(4)
2011十一月(4)
2011十月(3)
2011九月(7)
2011八月(13)
2011七月(8)
2011六月(8)
2011五月(3)
所有文章列表
文章搜尋
新聞交換(RSS)
誰來我家
參觀人氣
本日人氣:
累積人氣:
QRCode
POWEREDBY
(登入)
回到頁首
回到主文
免費註冊
客服中心
痞客邦首頁
©2003-2022PIXNET
關閉視窗
延伸文章資訊
- 1堆積- 維基百科,自由的百科全書 - Wikipedia
堆積(英語:Heap)是電腦科學中的一種特別的完全二元樹。若是滿足以下特性,即可稱為堆積:「給定堆積中任意節點P和C,若P是C的母節點,那麼P的值會小於等於(或大於 ...
- 2Stack 與Heap 有何差別. 程式設計相關的行業 - Medium
- 3stack vs heap:執行時期儲存兩大要角 - 劉逸的留意世界
當資訊為動態配置產生,系統會存放在另外一塊空間,稱之為『Heap』(注意這裡的Heap跟資料結構中的Heap不相關,可別會錯意!)。Heap的區塊專收執行期間動態 ...
- 4[資料結構] 堆積(Heap) - iT 邦幫忙
堆積(Heap),是一種特殊的完全二元樹,而堆疊不一樣,是完全不同的概念。 有分兩種,一種是最小堆積,另一種是最大堆積。 最小堆積. 如下圖,完全二元樹所有的父節點都 ...
- 5[資結] 淺談Heap
Heap呢,有些地方翻做「錐型結構」或「錐疊」,電腦辭典譯作「堆積」,聽起來跟堆疊有點 ... Heap的用途很廣,也有很多奇怪的用途,這裡就不多提囉~.