VMMap(查看內存工具)

來源:html

http://www.cnblogs.com/georgepei/archive/2012/03/07/2383445.htmlapp

http://www.cnblogs.com/georgepei/archive/2012/03/07/2383548.html工具

 

任務管理器中跟內存相關有兩個重要的指標Private(提交大小)和working set(工做設置)。以下圖所示:測試

這兩個指標在process explorer中叫作Private Bytes和Working Set。htm

而在VMMap中,他們則分別被叫作Private和Total Working Set。我這裏也用Private和working set來稱呼他們。blog

他們常常被用來標識一個進程到底佔用了多少內存,你知道他們分別表明什麼嗎?進程

 

Private指的是當你修改他時僅僅當前進程會受到影響。(copy-on-wirte屬性的頁面還沒被修改時也屬於此類)。這類通常包括Heap,stack和image的copy-on-write的部分。Private是虛擬內存的概念,其對應的內存可能被物理內存backup,也可能被paging file backup。好比用new來建立一個100M的內存時,private就增長100M,可是這塊內存在被訪問以前,其實是paging file backup的,物理內存並無真正佔用。(win7下測試所得)內存

 

Working set是指物理內存。可是這個物理內存既包括了屬於當前進程的私有物理內存(Private Working set)。也包括了能夠共享的Working set(Sharable Working Set)。Private Working Set 就是前面的Private的一部分,Private的另一部分由paging file backup。it

 

在VMMap中,還有一個概念是Committed,它也是虛擬內存的概念,其實能夠分爲Private的虛擬內存和能夠共享的虛擬內存。而能夠共享的虛擬內存的由物理內存backup的部分就是sharable working set。io

 

因此:

從私有和可共享的角度來看:
Committed = Private virtual memory + sharable virtual memory

從memory由什麼back up來看:

Committed = memory backed by paging file + working set

 

Private Virtual Memory = Private Working set + private memory backed by paging file

Working set = private working set + sharable working set

 

-------------

上面介紹了任務管理器中關於內存的兩個重要概念:private和working set。可是內存遠不止那麼簡單,下面我根據VMMap來詳細介紹一下內存的分類。

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

還好咱們有VMMap這個工具,它用兩個緯度將內存進行了詳細的劃分。

一個是縱向的緯度,也就是內存是從哪裏來的。分爲

  1. Image(可執行文件),
  2. Mapped file(由CreateFileMapping以文件做爲back up)。
  3. Sharable(由CreateFileMapping之內存做爲 back up)
  4. Private Data(由Virtual Alloc分配)
  5. Heap(由new,GlobalAlloc和HeapAlloc等分配)
  6. Stack(棧佔用的控件)
  7. Page table(內核裏面維護當前虛擬地址控件所須要的內存)
  8. Managed Heap(由.NET garbage collector分配和管理)

               

還有一個橫向的維護,分別被稱爲:

 

  1. Size: 整體大小,包括了commit和沒有reservce的內存。若是這項和Committed不 一致,那麼就是說有reserve的內存。
  2. Committed: committed的大小,包括Private內存和可共享的內存。
  3. Private:屬於當前進程的虛擬內存,指的是當你修改他時僅僅當前進程會受到影響。(copy-on-wirte屬性的頁面還沒被修改時也屬於此類)

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

而如下的幾個指標指的是物理內存:

  1. Total WS: 全部的working set,包括private working set和sharable working set。
  2. Private WS: private working set。僅屬於當前進程的working set。
  3. Sharable WS。可共享的working set。
  4. 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也降低。

 

Memory Based CreateFileMapping

這個file mapping無論有沒有命名,下面的行爲都同樣。

受影響的是VMMap中的Sharable行。

調用CreateFileMapping時,不影響任何列,增長的只是系統的Total Commit Charge。

調用MapViewOfFile時,上升的是Size和Committed列。

當訪問這些map的數據時,上升的是Total Working Set和Sharable Working Set。

調用UnmapViewOfFile時,Size,Committee和Working set列都降低。

調用CloseHandle來關閉CreateFileMapping建立的handle時,不影響任何列, 可是減小了系統的Total Commit Charge。

 

共享狀態下的Memory based CreateFileMapping

須要注意的是這個file mapping命名了,而且是在同一個進程中打開兩次,以達到共享的目的。

受影響的是VMMap中的Sharable列。

調用第一個調用CreateFileMapping時,不影響任何列,增長的只是系統的Total Commit Charge。

調用MapViewOfFile時,上升的是Size和Committed列。

當訪問這些map的數據時,上升的是Total Working Set和Sharable Working Set。

以上行爲跟前面一個Scenario徹底同樣,下面要開始建立再次打開剛纔建立的File mapping.

當用一樣的名字再次調用CreateFileMapping打開前面建立的file mapping時,系統的Total Commit Charge不受影響,也不影響VMMap中的任何列。

調用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 CreateFileMapping

受影響的是Mapped File行。

調用CreateFileMapping時,沒有影響到VMMap中的任何列,而且跟Memory Based File mapping不同的是,Total Commit Charge也不受 影響,由於他是以File 做爲back up的

調用MapViewOfFile時,上升的是Size和Committed列。跟Memory Based File mapping同樣的表現。

當訪問這些map的數據時,上升的是Total Working Set和Sharable Working Set。跟Memory Based File mapping同樣的表現。

調用UnmapViewOfFile時,Size,Committee和Working set列都降低。跟Memory Based File mapping同樣的表現。

調用CloseHandle來關閉CreateFileMapping建立的handle時,不影響任何列, 也不影響Total Commit Charge。

總結:file based和memory based不一樣點在於:

  1. File based影響是Mapped file行,memory based影響的是Sharable行。
  2. File based 不影響total commit charge, memory based 影響。

 

在MSDN中搜索CreateFileMapping:簡單來講就是一個內存映射,能夠以文件做爲back up也能夠之內存做爲back up。映射出來的內存能夠在多個進程間共享,而且這是在多個進程間共享大量數據的主要方式。

相關文章
相關標籤/搜索