Window記憶體詳解(五) VMMAP記憶體檢視工具

2021-07-02 02:58:20 字數 2473 閱讀 2962

下面我根據vmmap來詳細介紹一下記憶體的分類。

記憶體是乙個很複雜的系統,其中的paging file,sharable memory,reserve和commit等概念使得要算清楚乙個程序到底使用了多少記憶體幾乎成了不可能的事情了。

還好我們有vmmap這個工具,它用兩個緯度將記憶體進行了詳細的劃分。

乙個是縱向的緯度,也就是記憶體是從**來的。分為

image(可執行檔案),

private data(由virtual alloc分配)

heap(由new,globalalloc和heapalloc等分配)

stack(棧占用的控制項)

page table(核心裡面維護當前虛擬位址控制項所需要的記憶體)

managed heap(由.net garbage collector分配和管理)

還有乙個橫向的維護,分別被稱為:

size: 總體大小,包括了commit和沒有reservce的記憶體。如果這項和committed不 一致,那麼就是說有reserve的記憶體。

committed: committed的大小,包括private記憶體和可共享的記憶體。

private:屬於當前程序的虛擬記憶體,指的是當你修改他時僅僅當前程序會受到影響。(copy-on-wirte屬性的頁面還沒被修改時也屬於此類)

以上實際上是虛擬記憶體(virtual memory)的概念,其中的內容可能被物理記憶體(physical memory)back up,也可能被paging file back up。

而以下的幾個指標指的是物理記憶體:

total ws: 所有的working set,包括private working set和sharable working set。

private ws: private working set。僅屬於當前程序的working set。

sharable ws。可共享的working set。

shared ws。已經共享的working set,這個值應該是sharable working set的一部分或者全部。

為了更具體的了解這幾個指標,下面我們根據一些api的具體行為所產生的結果來觀察一下他們的含義。

new,globalalloc and heapalloc:

受影響的是vmmap中的heap行。

分配時占用的是committed和private列,working set不受影響。

當訪問時total working set和private working set跟著上公升。

virtualalloc:

受影響的是vmmap中的private data行。

分配reserve的data時,上公升的是第一列size,第二列committed不變。

commit時,上公升的是committed和private列。total working set列不變。

當訪問commit的記憶體時,上公升的是total working set 和private working set列。

decommit時,只有第一列size保持不變,committed,private和working set列都下降。

release時,第一列size也下降。

受影響的是vmmap中的sharable行。

呼叫mapviewoffile時,上公升的是size和committed列。

當訪問這些map的資料時,上公升的是total working set和sharable working set。

呼叫unmapviewoffile時,size,committee和working set列都下降。

受影響的是vmmap中的sharable列。

呼叫mapviewoffile時,上公升的是size和committed列。

當訪問這些map的資料時,上公升的是total working set和sharable working set。

呼叫mapviewoffile時,上公升的是size和committed列。也就是說,上公升第二次了。

當訪問這些map的資料時,上公升的是total working set和sharable working set。也是上公升第二次。

呼叫unmapviewoffile來ummap掉第二次開啟的view,size,,commmited和working set都下降一半。

呼叫unmapviewoffile來ummap掉第一次開啟的view,size,,commmited和working set都下降到初始狀態。

呼叫closehandle來關閉第二次開啟的handle,total commit charge不受影響。

呼叫closehandle來關閉第一次開啟的handle,total commit charge下降。

總結:file based和memory based不同點在於:

file based 不影響total commit charge, memory based 影響。

window記憶體管理與記憶體原理

windows為每個程序分配了4gb的虛擬位址空間,讓每個程序都認為自己擁有4gb的記憶體空間,4gb怎麼來的?32位 cpu可以取位址的空間為2的32次方,就是4gb 正如16位cpu有20根定址線所有擁有2的20次方的定址空間一樣 當我們在windows中雙擊乙個應用程式圖示後,系統為該應用程式...

Window 訊息大全使用詳解

window 訊息大全使用詳解 訊息,就是指windows發出的乙個通知,告訴應用程式某個事情發生了。例如,單擊滑鼠 改變視窗尺寸 按下鍵盤上的乙個鍵都會使windows傳送乙個訊息給應用程式。訊息本身是作為乙個記錄傳遞給應用程式的,這個記錄中包含了訊息的型別以及其他資訊。例如,對於單擊滑鼠所產生的...

Window 訊息大全使用詳解

window 訊息大全使用詳解 訊息,就是指windows發出的乙個通知,告訴應用程式某個事情發生了。例如,單擊滑鼠 改變視窗尺寸 按下鍵盤上的乙個鍵都會使windows傳送乙個訊息給應用程式。訊息本身是作為乙個記錄傳遞給應用程式的,這個記錄中包含了訊息的型別以及其他資訊。例如,對於單擊滑鼠所產生的...