使用vmmap.exe分析进程内存使用

参考:http://technet.microsoft.com/zh-cn/sysinternals/dd535533

vmmap是一个进程的虚拟和物理内存分析工具。它以图形化的方式显示进程某个时间点的内存快照,我们可以从中分析到程序为什么会占用这么多内存,以及都是什么类型的内存。

内存类型

VMMap把内存分成下面几种类型:

  1. Image。这内存代表由image loader已经加载到进程里面的可以执行文件,比如exe或者dll。但是不包括映射为数据文件的images它们归类为Mapped File内存。
  2. Private。Private内存是由VirtualAlloc分配的,但不包括Heap Manager或者.NET运行时再次分配的。它不能与其他进程共享。
  3. Shareable。Shareable内存是可以与其他进程共享的内存,它是以分页文件为支持的。通常它包含数据在不同进程dll之间共享或者同一个进程间的消息通讯。
  4. Mapped File。代表着磁盘上的文件,是可共享的内存。通常包含的是应用程序数据。
  5. Heap。是用户态对管理器管理的私有内存。应用程序通过c运行时刻的malloc,HeapAlloc ,LocalAlloc来分配内存。
  6. Managed Heap。.net垃圾回收器分配的内存。
  7. Stack。是每个线程用了存储函数参数,局部函数遍历和函数调用记录的私有内存。
  8. System。是与进程有关的私有内核态物理内存。绝大多数System内存是由进程页表组成的。
  9. Free。是进程地址表上还没有被分配的区域。

vmmap程序界面

当你启动vmmap的时候,会出现一个进程选择对话框。当你选择一个进程之后,vmmap就会开始分析这个进程的内存情况,以图形的方式显示出来:

  1. Commit Summary Graph。显示的是进程committed memory使用情况。也就是进程全部的虚拟内存使用情况。
  2. Private Summary Graph。显示committed的私有虚拟内存。这些内存都是以分页文件作为支持。
  3. Working Set Summary Graph。显示进程工作集的使用情况。工作集代表着进程的commited虚拟内存在物理内存中的数量。

接下来是汇总视图和详细视图:

  1. Summary View。显示进程的各种类型虚拟和物理内存的汇总情况。
  2. Details View。显示进程地址空间的内存区域。

对于这两个视图,每一栏的含义如下:

  • Size。分配区域的总大小,等同于所需最大物理内存的数量。
  • Committed。虚拟内存的数量。
  • Private。如果内存修改,则属于进程。copy-on-write机制。
  • Total WS。实际分配的物理内存大小。
  • Private WS。不与其他进程共享的私有物理内存数量。
  • Shareable WS。可以与其他进程共享的物理内存数量。
  • Shared WS。已经与其他进程共享的物理内存数量。
  • Locked WS。锁定到物理内存的工作集数量。对应这VirtualAlloc锁定的内存。
  • Largest。某个最大块的大小。

vmmap-window

字符串

通过view菜单选择strings,可以选择某块内存的以字符串格式显示内容。

使用

你可以选择一个已经运行中的进程。这样就可以看到了他某个时间点的内存信息。通过F5来刷新生成新的快照。这样就可以通过Timeline
来线性的观察内存的变化情况。也可以用鼠标选中两个时间点进行比较。

vmmap-timeline

另一种是用VMMap来启动一个新进程。这种做法的好处是可以自动的定时生成快照。还可以使用Call Tree和Trace功能。

vmmap-trace

你还可以设置Symbol Path来查看调用函数栈。不过很难用,微软符号经常加载不上。

《使用vmmap.exe分析进程内存使用》有1个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注