美文网首页
VMMap名词说明

VMMap名词说明

作者: zhengaoly | 来源:发表于2021-12-23 13:52 被阅读0次

    VMMap名词说明

    Committed: 进程向OS宣称要使用的内存大小(在虚拟内存进行了分配),基本上都不等于进程实际使用的物理内存大小。一是其中统计了进程所连接的全部动态库的空间,好比标准C库,而实际上OS在内存中只加载一份C库的代码段,全部进程共享使用。但每一个进程在运行时,依然要在本身的虚拟内存空间为C库分配好地址,OS的动态库管理程序会进行映射;二是OS分虚拟内存和物理内存。32位电脑上,每一个进程的虚拟内存空间可达4GB。当进程malloc()申请10MB空间时,先在虚拟内存中预留出10MB的地址空间(统计入Committed),但只有在真正读写这10MB空间时,才会经过缺页中断去建立对应的物理内存,并在进程的Total WS(WorkSet)中体现。因此Committed相对于进程实际使用的物理内存都比较大。blog

    Private Bytes:上面的Committed包含了不少共享库的内存,Private Bytes则是属于进程独占的内存。好比一个动态库,虽然代码段是共享的,但数据段是每一个进程各自拷贝一份并维护。Private Bytes依然不彻底等于进程使用的物理内存,它是进程独占的虚拟内存大小统计。进程

    Working Set: 进程使用中的物理内存,包含了进程独占的物理内存和可共享的物理内存(主要是共享库所使用的物理内存)。注意:使用“使用中”,是为了强调进程只是正在使用这块物理内存,但并不表明所有是由进程申请的。内存

    示例解读:get

    进程虚拟内存已经分配了206,264KB(Committed),其中属于进程私有的虚拟内存为34,148KB(Private Bytes),二者差值能够粗略认为是各类可共享动态库所占的虚拟内存大小。进程实际使用中的物理内存是32,540KB(Working Set)。it

    image

    下图中,Committed、Private、Total WS分别对应于上面的Committed、Private Bytes、Working Set。其中:class

    Total WS = Private WS + Shareable WS。Shared WS表示Shareable WS中已经共享的部分。map

    Image:进程自身可执行文件以及包含的全部库。虽然这些库的总大小为176,184KB,但不少是共享的,属于进程独占的只有13,184KB。下载

    其余名词解释可见VMMap里面的Help。程序

    对于进程内存优化,大部分时候重点关注Heap行的Total WS使用状况,即进程堆中分配且实际使用的物理内存。

    image

    vmmap和window资源管理器关系

    image.png

    前一篇文章介绍了任务管理器中关于内存的两个重要概念: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分配和管理)
    image

    还有一个横向的维护,分别被称为:

    1. Size: 总体大小,包括了commit和没有reserve的内存。如果这项和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 影响。

    相关文章

      网友评论

          本文标题:VMMap名词说明

          本文链接:https://www.haomeiwen.com/subject/eqmhqrtx.html