VMMap(查看内存工具)
来源:
http://www.cnblogs.com/georgepei/archive/2012/03/07/2383445.html
http://www.cnblogs.com/georgepei/archive/2012/03/07/2383548.html
任务管理器中跟内存相关有两个重要的指标Private(提交大小)和working set(工作设置)。如下图所示:
这两个指标在process explorer中叫做Private Bytes和Working Set。
而在VMMap中,他们则分别被叫做Private和Total Working Set。我这里也用Private和working set来称呼他们。
他们经常被用来标识一个进程到底占用了多少内存,你知道他们分别代表什么吗?
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。
在VMMap中,还有一个概念是Committed,它也是虚拟内存的概念,其实可以分为Private的虚拟内存和可以共享的虚拟内存。而可以共享的虚拟内存的由物理内存backup的部分就是sharable working set。
所以:
从私有和可共享的角度来看:
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这个工具,它用两个纬度将内存进行了详细的划分。
一个是纵向的纬度,也就是内存是从哪里来的。分为
- Image(可执行文件),
- Mapped file(由CreateFileMapping以文件作为back up)。
- Sharable(由CreateFileMapping以内存作为 back up)
- 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也下降。
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不同点在于:
- File based影响是Mapped file行,memory based影响的是Sharable行。
- File based 不影响total commit charge, memory based 影响。
在MSDN中搜索CreateFileMapping:
简单来说就是一个内存映射,可以以文件作为back up也可以以内存作为back up。映射出来的内存可以在多个进程间共享,并且这是在多个进程间共享大量数据的主要方式。
VMMap(查看内存工具)的更多相关文章
- linux日常管理-free查看内存工具
查看内存 命令 free 默认是k为单位 也可以指定 m为单位 或者G为单位,这个不精准 total 总容量 used 使用了多少 free 剩余多少 看第二行.第一行是物理内存,加上虚拟内存b ...
- 配置JVM内存 查看内存工具
一.配置JVM内存 1.配置JVM内存的參数有四个: -XmxJavaHeap最大值.默认值为物理内存的1/4.最佳设值应该视物理内存大小及计算机内其它内存开销而定. -XmsJavaHeap初始值, ...
- 【Android】开发优化之——调优工具:dump hprof file 查看内存情况,找到内存泄露
虽说知道一般性的开发android应用须要注意的问题,但是也有水平參差不齐的情况.特别是维护代码,假设内存占用大,内存溢出严重,又怎么解决呢? -- 通过DDMS把heap抓出来分析 1.打开DD ...
- SysInternals提供了一个工具RamMap,可以查看内存的具体使用情况
SysInternals提供了一个工具RamMap,可以查看内存的具体使用情况.如果发现是Paged Pool和Nonpaged Pool占用过大,可以用另一个工具poolmon来查看占用内存的驱动T ...
- Linux进程管理——查看内存的工具
Linux进程管理——查看内存的工具 一查看内存的工具vmstat vmstat命令:虚拟内存信息vmstat [options] [delay [count]]vmstat 2 5 [root@ce ...
- 萌新笔记——linux下查看内存的使用情况
windows上有各种软件可以进行"一键加速"之类的操作,释放掉一些内存(虽然我暂时不知道是怎么办到的,有待后续学习).而任务管理器也可以很方便地查看各进程使用的内存情况,如下图: ...
- Android中如何查看内存
文章参照自:http://stackoverflow.com/questions/2298208/how-to-discover-memory-usage-of-my-application-in-a ...
- free命令查看内存使用情况(转载)
linux free命令查看内存使用情况 时间:2016-01-05 06:47:22来源:网络 导读:linux free命令查看内存使用情况,free命令输出结果的各选项的含义,以及free结果中 ...
- ubuntu查看内存占用和查看cpu使用情况的简单方法(ubuntu内存管理)
单独查看内存使用情况的命令:free -m查看内存及cpu使用情况的命令:top也可以安装htop工具,这样更直观,安装命令如下:sudo apt-get install htop安装完后,直接输入命 ...
随机推荐
- Windows Store 手势编程小结
Windows Store 手势编程小结 最近完成了一个Windows Store上面的手势操作的页面.在这里总结了一下经验和心得,希望能和大家一起分享和讨论一下. 首先,要纠正一个误区,在Windo ...
- xls===>csv tables===via python ===> sqlite3.db
I've got some files which can help a little bit to figure out where people are from based on their I ...
- 如何让msvsmon.exe 以服务方式运行
通常我们在VS上调试程序用的都是msvsmon.exe, 使用管理员权限运行再选项设置任何人可以调试就可以了,而这个在绝大多数情况下都没有问题.而我想说的就是特殊的情况,跟msvsmon的运行权限相关 ...
- http学习笔记(3)
几乎所有的http通信都是由TCP/IP承载的.http好比一辆汽车,而TCP是一条公路,所有的汽车都要在公路上跑,看看http是如何在tcp这条公路上往返的. 首先简单地看看tcp,TCP连接是通过 ...
- 线程内唯一对象HttpContext
在asp.net中,HttpContext是主线程内唯一对象.在web应用中开启多线程,在另外一个线程中是无法访问HttpContext. 如果需要在另外一个线程中使用HttpContext.Curr ...
- 关于国产跨平台的开源游戏引擎LGame
声明: 本博客文章原创类别的均为个人原创,版权所有.转载请注明出处: http://blog.csdn.net/ml3947,另外本人的个人博客:http://www.wjfxgame.com. ...
- PB导出规定格式DBF文件
最近在做一个给卫计委做数据上报的数据接口,接口要求使用奇葩的dBase 3数据库存储上报数据,忙活了几天总算搞好了,使用开发工具为powerbuild 12,222个字段的上报数据表生成DBF文件,写 ...
- 从ASP.NET Web API 2 (C#)开始说起
[译]Getting Started with ASP.NET Web API 2 (C#) 单击此处查看原文 HTTP不是单单为网页服务的,它更是一种用于构建API(用于暴露服务和数据)的强大平台. ...
- python 函数简介之三
1. 非固定个数的实参----参数组,* args ,其结果将以元组的形式呈现出来 def func(*args): print(args) func(1,2,3,4,5) #第一种调用方式, 多个实 ...
- 微信小程序入门——怎么建多个项目?(导入官方Demo程序进行学习)
昨天1月9日微信小程序发布,顿时被朋友圈刷爆,今天看了一下官方文档,自己开始一步一步搭建环境体验小程序开发. 常见问题: 1.微信小程序开发是否需要重新创建开发者账号? 需要,即使之前申请了微信服务号 ...