堆和棧的區別

堆和棧老是會弄混,所以記錄一下,方便以後複習。

棧:由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。存放數據時是先進後出。棧使用的是一級緩存, 他們通常都是被調用時處於存儲空間中,調用完畢立即釋放。

堆: 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收,分配方式倒是類似於鏈表。存放數據時是先進先出。堆則是存放在二級緩存中,生命週期由虛擬機的垃圾回收算法來決定(並不是一旦成爲孤兒對象就能被回收)。所以調用這些對象的速度要相對來得低一些。

我記得以前上課的時候老師說堆和棧一個是地址遞增,一個遞減,但是網上看到的資料說堆棧既可以遞增,最後從網上查閱到堆地址從低到高,棧地址從高到低。這是由於內存優化分配問題,在加載代碼的時候都是從低地址往高地址存放代碼,系統分配一個任務所用的內存是一定的,這個任務所佔用的內存是包括棧的,想想看,如果佔是由低到高分配的你這個任務所用的內存就不是固定的值了。總的來說棧結構從高地址到低地址是爲了固定任務內存。



發佈了24 篇原創文章 · 獲贊 7 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章