程序的記憶體管理

2021-07-29 11:34:40 字數 1068 閱讀 6328

一、在作業系統中,系統會給每個程序分配虛擬位址,虛擬位址的大小與處理器的位數有關,如32位處理器程序可分配4gb的虛擬記憶體供程式正常執行。

這4gb的虛擬記憶體,儲存單元從位址0開始進行排序,此位址為虛擬位址。

此虛擬位址可分為:

1、棧區(stack):由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。執行緒也有自己維護的棧。

2、堆區(heap) :程式動態申請的空間,由程式釋放或其他方式釋放,若沒有釋放,可能導致記憶體洩露。    

3、全域性區(靜態區)(static):全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域, 未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。 - 程式結束後有系統釋放 

4、文字常量區:常量字串就是放在這裡的。 程式結束後由系統釋放

5、程式**區:存放函式體的二進位制**。

二、下面主要分析棧區和堆區的分配和釋放方式:

1、棧區:棧區是從高位址往低位址分配的,初始的棧區棧指標指向棧的最高位址單元,而釋放總是從低位址往高位址釋放(先進後出)。棧區的分配與釋放由編譯器自動完成

如下:}

整形a將先入棧高位址空間,佔4個位元組,接著雙精度浮點數b入棧,佔8個位元組。變數b的作用域比a先結束,於是b所佔據的空間先被**。

如下圖所示,紅色區域為已占用區,黃色區域為空閒區

帶引用的情況:

此種情況a將在棧區分得4個單元空間以存放customer例項的位址。

customer物件將儲存在堆上。

2、堆區:

堆區與棧區的位址結構類似,不同點在於:

a、需要程式主動申請,釋放根據不同的語言釋放方式不同(c、c++、delphi等需要程式顯示釋放,.net有自動**機制)

b、堆區是由低位址向高位址分配的。釋放的順序是不定的,基於堆上物件的生存週期。會產生記憶體碎片。

三、記憶體的釋放

記憶體管理與程序排程

一 記憶體管理 1 核心 使用alloc pages申請物理頁幀 使用kmalloc申請專用 通用記憶體塊 vmalloc申請物理不連續,邏輯相連記憶體 使用kmap建立高階位址對映 外碎片 空閒記憶體零散分布,無法滿足大記憶體需求 夥伴系統解決 內碎片 申請一塊記憶體真正使用的只有小部分 slab...

Android 程序 記憶體管理誤區

乙個極其意外的習慣 程序全殺 禁止自啟動 記得剛剛開始用i5700時,我和很多人有著乙個一樣的習慣 全殺程序。i5700的ram很小,而我又有一邊開著uc一邊開著校內一邊開著ireader看書的惡習,通過諸如advanced task killer之類的軟體清理程序,看到空閒ram一下子變多的時候容...

Android的記憶體,程序排程管理 (二)

在執行乙個程式時,按一下房子鍵就可以退到桌面,一般來說按一下退出鍵也可以退到桌面,這兩者有什麼區別呢?其實是有區別的,你應該根據自己的需要靈活選擇 按房子鍵,看起來似乎是退出了,但是其實這個軟體並沒有被關閉,而是轉為了 後台程式 指一般的軟體,不討論特別種類的軟體 按退出鍵,看起來也是退出沒錯,但這...