已修改記憶體占用高 記憶體緊縮(記憶體碎片化處理)

2021-10-12 05:44:05 字數 1341 閱讀 2074

前邊介紹的有關動態記憶體管理的方法,無論是邊界標識法還是夥伴系統,但是以將空閒的儲存空間鏈結成乙個鍊錶,即可利用空間表,對儲存空間進行分配和**。本節介紹另外一種動態記憶體管理的方法,使用這種方式在整個記憶體管理過程中,不管哪個時間段,所有未被占用的空間都是位址連續的儲存區。

這些位址連續的未被占用的儲存區在編譯程式中稱為堆。

假設儲存區的初始狀態如圖 1 所示,若採用本節介紹的方法管理這塊儲存區,當 b 占用塊執行完成同時所佔的儲存空間釋放後,儲存區的狀態應如圖 2 所示:

在分配記憶體空間時,每次都從可利用空間中選擇最低(或者最高)的位址進行分配。具體的實現辦法為:設定乙個指標(稱為堆指標),每次使用者申請儲存空間時,都是堆的最低(或者最高)位址進行分配。假設當使用者申請 n 個單位的儲存空間時,堆指標向高位址(或者低位址)移動 n 個儲存單位,這 n 個儲存單位即為分配給使用者使用的空閒塊,空閒塊的起始位址為堆指標移動之前所在的位址。例如,某一時間段有四個使用者(a、b、c、d)分別申請 12 個單位、6 個單位、10 個單位和 8 個單位的儲存空間,假設此時堆指標的初值為 0。則分配後儲存空間的效果為:

由於系統中的可利用空間始終都是乙個連續的儲存空間,所以**時必須將使用者釋放的儲存塊合併到這個堆上才能夠重新使用。儲存緊縮有兩種做法:其一是一旦使用者釋放所佔空間就立即進行**緊縮;另外一種是在程式執行過程中不立即**使用者釋放的儲存塊,而是等到可利用空間不夠分配或者堆指標指向了可利用儲存區的最高位址時才進行儲存緊縮。具體的實現過程是:

計算占用塊的新位址。設立兩個指標隨巡查向前移動,分別用於指示占用塊在緊縮之前和之後的原位址和新位址。因此,在每個占用塊的第乙個儲存單位中,除了儲存該占用塊的大小和標誌域之外,還需要新增乙個新位址域,用於儲存占用塊在緊縮後應有的新位址,即建立一張新、舊位址的對照表。

修改使用者的出事變數表,保證在進行儲存緊縮後,使用者還能找到自己的占用塊。

檢查每個占用塊中儲存的資料。如果有指向其它儲存塊的指標,則需作相應修改。

將所有占用塊遷移到新位址去,即進行資料的傳遞。

最後,還要將堆指標賦以新的值。

儲存緊縮較之無用單元收集更為複雜,是乙個系統的操作,如果不是非不得已不建議使用。

Linux 查記憶體占用高 程序

linux下有時候需要檢視系統記憶體占用的情況,兩個方法。乙個是用top 輸入大寫的m 可以檢視到占用記憶體的程序pid,以及占用的百分比 pid是第一列,記憶體占用百分比是 mem這一列 另外也可以通過下面的方法查記憶體占用 ps aux sort nk4 這個命令其實就相當於 ps aux so...

類記憶體占用

類所佔記憶體的大小是由成員變數 靜態變數除外 決定的,成員函式 是不計算在內的。成員函式還是以一般的函式一樣的存在。a.fun 是通過fun a.this 來呼叫的。所謂成員函式只是在名義上是類裡的。其實成員函式的大小不在類的物件裡面,同乙個類的多個物件共享函式 而我們訪問類的成員函式是通過類裡面的...

減少mysql記憶體 減少mysql記憶體占用

小站點的伺服器一般在512m或1g左右,但是我們安裝的mysql 5.6 5.7預設啟動占用記憶體400多m,mysql記憶體佔用率明顯偏高,將會導致mysql崩潰,經常出現mysql自動停止的情況。mysql的使用記憶體可以優化的。主要有兩種方法 關閉performance schema和調整ms...