转:http://blog.csdn.net/woddle/article/details/45337767

下面我根据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和没有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内存查看工具的更多相关文章

  1. iOS应用程序内存查看工具

    我要找的是一个可以检查应用程序中哪一个数组存贮的什么内容的工具. 网上搜到的工具名称是Allocations Instrument,后来一试发现不是我想要的.这还是一个后期调试阶段的内存检查工具. h ...

  2. linux内存查看工具

    这里帮你总结了一下Linux下查看内存使用情况的多种方法~ 在做 Linux 系统优化的时候,物理内存是其中最重要的一方面.自然的,Linux 也提供了非常多的方法来监控宝贵的内存资源的使用情况.下面 ...

  3. Android内存分析工具

    在Android系统开发过程中,经常会要去分析进程的内存的使用情况,简单介绍下Android内存分析的相关工具. 文章参考: 1.dumpsys 2.memory-analysis-command 1 ...

  4. 配置JVM内存 查看内存工具

    一.配置JVM内存 1.配置JVM内存的參数有四个: -XmxJavaHeap最大值.默认值为物理内存的1/4.最佳设值应该视物理内存大小及计算机内其它内存开销而定. -XmsJavaHeap初始值, ...

  5. Java内存泄露分析和解决方案及Windows自带查看工具

    Java内存泄漏是每个Java程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端就会出现内存无限制的增长,最后系统瘫痪,那么如何最快最好的检测程序的稳定性,防止系统崩盘,作者用自已的亲身经历 ...

  6. Linux进程管理——查看内存的工具

    Linux进程管理——查看内存的工具 一查看内存的工具vmstat vmstat命令:虚拟内存信息vmstat [options] [delay [count]]vmstat 2 5 [root@ce ...

  7. Windows系统内存分析工具的介绍

      Windows系统内存分析工具的介绍(进程管理器,资源管理器,性能监视器, VMMap, RamMap,PoolMon) 微软官方提供多种工具来分析Windows 的内存使用情况,除了系统自带的任 ...

  8. javascript js 内存泄露工具使用

    javascript内存泄露工具使用 原文:http://lanhy2000.blog.163.com/blog/static/43678608201121472644851/ 2011-03-14 ...

  9. JS内存泄漏 和Chrome 内存分析工具简介(摘)

    原文地址:http://web.jobbole.com/88463/ JavaScript 中 4 种常见的内存泄露陷阱   原文:Sebastián Peyrott 译文:伯乐在线专栏作者 - AR ...

随机推荐

  1. 什么是JavaFX

    什么是JavaFX JavaFx平台是一个富客户端平台解决方案,它能够使用应用程序开发人员轻松的创建跨平台的富客户端应用程序.它构建在Java技术的基础之上,JavaFX平台提供了一组丰富的图形和媒体 ...

  2. OpenCV---色彩空间(二)HSV追踪颜色对象和通道分离与合并

    一:HSV追踪有颜色对象 def inRange(src, lowerb, upperb, dst=None) #lowerb是上面每个颜色分段的最小值,upperb是上面每个颜色分段的最大值,都是列 ...

  3. mysql数据库使用sql命令窗口查询的数据,改成sql语句导入到mysql数据库中

    1.查询语句为select * from t_table;导出的数据格式如下: 2.将数据文本备份,然后使用NOTEPAD++打开,然后只拷贝数据到新建txt中,然后进行如下替换: 1)将“ | ”分 ...

  4. Window启动Zookeeper报错java.lang.NumberFormatException: For input string:

    用zkServer start命令报如题的错误,改为直接用zkServer启动则ok 还有在window下,myid文件不能是myid.txt,不能带文件格式 dataDir=D:/zookeeper ...

  5. 【IDEA】 Can't Update No tracked branch configured for branch master or the branch doesn't exist. To make your branch track a remote branch call, for example, git branch --set-upstream-to origin/master

    IDEA点击GIT更新按钮时,报错如下: Can't UpdateNo tracked branch configured for branch master or the branch doesn' ...

  6. 《HTML5编程之旅》系列二:Communication 技术初探

     本文主要探讨用于构建实时跨源通信的两个模块:跨文档消息通信(Cross Document Messaging)和XMLHttpRequestLevel2.通过这两个模块,我们可以构建不同域间进行安全 ...

  7. 【CODEVS】1922 骑士共存问题

    [算法]二分图最大匹配(最大流) [题解]按(i+j)奇偶性染色后,发现棋子跳到的地方刚好异色. 然后就是二分图了,对于每个奇点向可以跳到的地方连边,偶点不需连(可逆). 所以题目要求转换为求二分图上 ...

  8. Metasploit 使用基础

    本文将简单介绍一下Kali2 上Metasploit的一些基本使用,包括启动.更新及一个小问题"Module database cache not built yet, using slow ...

  9. Ubuntu 下 CodeBlocks 修改用户自定义颜色主题 及 更新CodeBlocks到最新版本

    Code::Blocks默认的白色编辑器界面看久了眼睛很累, 所以想换成dark的主题, 眼睛会舒服些. 1. 安装好codeblocks后, 先运行一次, 关闭, 这时程序会提示你是否要保存defa ...

  10. 二. Jmeter--参数化

    1. 新建一个txt文件,输入些数据, 一行有四个数据,用逗号分隔. 保存的时候Encoding选择Unicode 2.添加一个Thread Group, 然后添加一个CSV Data Set Con ...