来源: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这个工具,它用两个纬度将内存进行了详细的划分。
一个是纵向的纬度,也就是内存是从哪里来的。分为
还有一个横向的维护,分别被称为:
以上其实是虚拟内存(virtual memory)的概念,其中的内容可能被物理内存(physical memory)back up,也可能被Paging file back up。
而如下的几个指标指的是物理内存:
为了更具体的了解这几个指标,下面咱们根据一些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不一样点在于:
在MSDN中搜索CreateFileMapping:简单来讲就是一个内存映射,能够以文件做为back up也能够之内存做为back up。映射出来的内存能够在多个进程间共享,而且这是在多个进程间共享大量数据的主要方式。