参考文献:

http://blog.csdn.net/wubin1124/article/details/3760242

工作集(内存): 可以这么理解, 此值就是该进程所占用的总物理内存. 但是这个值是由两部分组成, 即 '专用工作集' + '共享工作集'.

内存(专用工作集): 这对于一个进程是最重要的, 它代表了一个进程独占用了多少内存.

内存(共享工作集): 这是该进程和别的进程共享的内存量. 通常, 这是加载一个 dll 所占用的内存.

提交大小: 属于 Committed 那一类. 但是不一定在物理内存中, 有些可能位于交换文件中. 如果有一个程序, 原本占 500MB 内存, 但是绝大多数内存都不使用, 则可以通过 `EmptyWorkingSet` 向操作系统发送请求, 将此进程的不常用的内容从物理内存中换出到换页文件中保存, 如下图:


写在最后


0. 工作集, 即在物理内存中的数据的集合.

1. 工作集 = 专用 + 共享

2. 将所有的 "工作集" 相加后的值会大于任务管理器中内存占用的百分比, 因为百分比对共享内存进行排重了.

3. "提交大小" 和 "工作集" 是两个层面的概念, 大部分活跃进程的 "工作集" 会大于 "提交大小", 而大部分非活跃的进程 "工作集" 会小于 "提交大小", 但是两者没有绝对关系.

4. 虚拟内存: 就是换页文件.

分页文件:硬盘上一个或者多个隐藏文件pagefile.sys,Windows用于存储未存入内存的部分程序和数据文件。页面文件和物理内存或随机存取内存(RAM)构成了虚拟内存。Windows会根据需要将数据从页面文件移至内存,或将数据从内存移至页面文件以便为新数据释放内存。也叫“交换文件”。

Windows使用工具集:

Sysinternals Suite

https://technet.microsoft.com/zh-cn/library/bb842062.aspx


分页和非分页内存
Windows规定有些虚拟内存页面是可以交换到磁盘的文件中的,这类内存被称为分页内存,而有些虚拟内存是不能被交换到磁盘的文件中,这些内存被称为非分页内存。当程序的中断请求在DISPATCH_LEVEL之上时,包括DISPATCH_LEVEL,程序只能使用非分页内存。

  1. // WindbgCmdTest.cpp : Defines the entry point for the console application.
  2. //
  3. #include "stdafx.h"
  4. #include <iostream>
  5. #include <Windows.h>
  6. using namespace std;
  7. #pragma comment(lib,"Psapi.lib")
  8. #include <Psapi.h>
  9. #define MEM_M (1024*1024)
  10. void OutputSystemMem(MEMORYSTATUS New, MEMORYSTATUS Old)
  11. {
  12. //cout<<"减少物理内存="<<(New.dwAvailPhys-Old.dwAvailPhys)/MEM_M<<endl;
  13. //cout<<"减少可用页文件="<<(New.dwAvailPageFile-Old.dwAvailPageFile)/MEM_M<<endl;
  14. //cout<<"减少可用进程空间="<<(New.dwAvailVirtual-Old.dwAvailVirtual)/MEM_M<<endl;
  15. }
  16. static PROCESS_MEMORY_COUNTERS stLastMem;
  17. void OutputProcessMem()
  18. {
  19. PROCESS_MEMORY_COUNTERS pro;
  20. HANDLE handle = GetCurrentProcess();
  21. GetProcessMemoryInfo(handle, &pro, sizeof(pro));
  22. cout<<"缺页中断次数 "<<"new("<<pro.PageFaultCount/MEM_M<<") "<<"old("<<stLastMem.PageFaultCount/MEM_M<<")"<<endl;
  23. cout<<"使用内存高峰 "<<"new("<<pro.PeakWorkingSetSize/MEM_M<<") "<<"old("<<stLastMem.PeakWorkingSetSize/MEM_M<<")"<<endl;
  24. cout<<"当前使用的内存 "<<"new("<<pro.WorkingSetSize/MEM_M<<") "<<"old("<<stLastMem.WorkingSetSize/MEM_M<<")"<<endl;
  25. cout<<"使用页面缓存池高峰 "<<"new("<<pro.QuotaPeakPagedPoolUsage/MEM_M<<") "<<"old("<<stLastMem.QuotaPeakPagedPoolUsage/MEM_M<<")"<<endl;
  26. cout<<"使用页面缓存池 "<<"new("<<pro.QuotaPagedPoolUsage/MEM_M<<") "<<"old("<<stLastMem.QuotaPagedPoolUsage/MEM_M<<")"<<endl;
  27. cout<<"使用非分页缓存池高峰 "<<"new("<<pro.QuotaPeakNonPagedPoolUsage/MEM_M<<") "<<"old("<<stLastMem.QuotaPeakNonPagedPoolUsage/MEM_M<<")"<<endl;
  28. cout<<"使用非分页缓存池 "<<"new("<<pro.QuotaNonPagedPoolUsage/MEM_M<<") "<<"old("<<stLastMem.QuotaNonPagedPoolUsage/MEM_M<<")"<<endl;
  29. cout<<"使用分页文件(提交的内存文件大小) "<<"new("<<pro.PagefileUsage/MEM_M<<") "<<"old("<<stLastMem.PagefileUsage/MEM_M<<")"<<endl;
  30. cout<<"使用分页文件高峰 "<<"new("<<pro.PeakPagefileUsage/MEM_M<<") "<<"old("<<stLastMem.PeakPagefileUsage/MEM_M<<")"<<endl;
  31. cout<<endl;
  32. memcpy(&stLastMem,&pro,sizeof(pro));
  33. }
  34. #define VIRTUAL_ALLOC_TEST_SIZE 10*MEM_M
  35. int _tmain(int argc, _TCHAR* argv[])
  36. {
  37. memset(&stLastMem,0,sizeof(stLastMem));
  38. OutputProcessMem();
  39. MEMORYSTATUS memStatusVirtual;
  40. GlobalMemoryStatus(&memStatusVirtual);
  41. LPVOID pV=VirtualAlloc(NULL,VIRTUAL_ALLOC_TEST_SIZE,MEM_RESERVE|MEM_TOP_DOWN,PAGE_READWRITE);
  42. if(pV==NULL)
  43. {
  44. cout<<"没有那么多虚拟空间!"<<endl;
  45. }
  46. MEMORYSTATUS memStatusVirtual1;
  47. GlobalMemoryStatus(&memStatusVirtual1);
  48. cout<<"VirtualAlloc(NULL,1000*1024*1024,MEM_RESERVE|MEM_TOP_DOWN,PAGE_READWRITE);"<<endl;
  49. OutputSystemMem(memStatusVirtual1,memStatusVirtual);
  50. OutputProcessMem();
  51. cout<<"\n";
  52. pV=VirtualAlloc(pV,VIRTUAL_ALLOC_TEST_SIZE,MEM_COMMIT,PAGE_READWRITE);
  53. if (pV == NULL)
  54. {
  55. DWORD eLastError = GetLastError();
  56. cout <<"eLastError: %d" << eLastError;
  57. }
  58. MEMORYSTATUS memStatusVirtual2;
  59. GlobalMemoryStatus(&memStatusVirtual2);
  60. cout<<"VirtualAlloc(pV,10*1024*1024,MEM_COMMIT|MEM_RESERVE,PAGE_READWRITE);"<<endl;
  61. OutputSystemMem(memStatusVirtual2,memStatusVirtual1);
  62. OutputProcessMem();
  63. char * pC = (char *)pV;
  64. cout<<"\n";
  65. cout<<"pC[VIRTUAL_ALLOC_TEST_SIZE-1] = 0;;"<<endl;
  66. pC[VIRTUAL_ALLOC_TEST_SIZE-1] = 0;
  67. OutputProcessMem();
  68. cout<<"\n";
  69. char * p = new char[10*MEM_M];
  70. MEMORYSTATUS memStatusVirtual8;
  71. GlobalMemoryStatus(&memStatusVirtual8);
  72. cout<<"char * p = new char[10*MEM_M];"<<endl;
  73. OutputSystemMem(memStatusVirtual8,memStatusVirtual2);
  74. OutputProcessMem();
  75. cout<<"\n";
  76. VirtualFree(pV,VIRTUAL_ALLOC_TEST_SIZE,MEM_DECOMMIT);
  77. MEMORYSTATUS memStatusVirtual3;
  78. GlobalMemoryStatus(&memStatusVirtual3);
  79. cout<<" VirtualFree(pV,10*1024*1024,MEM_DECOMMIT);"<<endl;
  80. OutputSystemMem(memStatusVirtual3,memStatusVirtual2);
  81. OutputProcessMem();
  82. cout<<"\n";
  83. VirtualFree(pV,VIRTUAL_ALLOC_TEST_SIZE,MEM_RELEASE);
  84. MEMORYSTATUS memStatusVirtual4;
  85. GlobalMemoryStatus(&memStatusVirtual4);
  86. cout<<"VirtualFree(pV,10*1024*1024,MEM_RELEASE);"<<endl;
  87. OutputSystemMem(memStatusVirtual4,memStatusVirtual3);
  88. OutputProcessMem();
  89. cout<<"\n";
  90. VirtualUnlock(pV,VIRTUAL_ALLOC_TEST_SIZE);
  91. MEMORYSTATUS memStatusVirtual5;
  92. GlobalMemoryStatus(&memStatusVirtual5);
  93. cout<<"VirtualUnlock(pV,10*1024*1024);"<<endl;
  94. OutputSystemMem(memStatusVirtual5,memStatusVirtual4);
  95. OutputProcessMem();
  96. cout<<"delete[] p;"<<endl;
  97. delete[] p;
  98. OutputProcessMem();
  99. getchar();
  100. return 0;
  101. }


Windows 内存管理的更多相关文章

  1. Windows内存管理[转]

    本文主要内容:1.基本概念:物理内存.虚拟内存:物理地址.虚拟地址.逻辑地址:页目录,页表2.Windows内存管理3.CPU段式内存管理4.CPU页式内存管理 一.基本概念1. 两个内存概念物理内存 ...

  2. windows内存管理方式以及优缺点

    Windows内存管理方式:页式管理,段式管理,段页式管理 页式管理 将各进程的虚拟空间(逻辑地址)划分为若干个长度相等的页,业内管理把内存空间(物理内存)按照页的大小划分为片或者页面,从而实现了离散 ...

  3. windows 内存管理的几种方式及其优缺点

    windows 内存管理方式主要分为:页式管理,段式管理,段页式管理. 页式管理的基本原理是将各进程的虚拟空间划分为若干个长度相等的页:页式管理把内存空间按照页的大小划分成片或者页面,然后把页式虚拟地 ...

  4. 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件

    本文背景: 在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用:根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制. 本 ...

  5. Windows内存管理的方式

    一.内存的概念 1. 物理内存:即插在主板上的内存条.他是固定的,内存条的容量多大,物理内存就有多大(集成显卡系统除外). 但是如果程序运行很多或者程序本身很大的话,就会导致大量的物理内存占用,甚至导 ...

  6. 20140919 进程间通信 系统栈 用户栈 多级反馈队列 windows 内存管理

    1.进程间通信 共享内存(剪切板) 匿名管道只能实现父子进程间的通信(以文件系统为基础): 匿名管道是什么,有什么用,怎么用 1.创建父进程,也就是在解决方案中建立一个parent的工程 2.在par ...

  7. 全面介绍Windows内存管理机制及C++内存分配实例

    转自:http://blog.csdn.net/yeming81/article/details/2046193 本文基本上是windows via c/c++上的内容,笔记做得不错.. 本文背景: ...

  8. Windows内存管理

    本博文很大程度上参考了,潘爱民先生的<Windows内核原理与实现>一书,在此对他表示感谢. 记得是在学C语言指针的时候,首次比较实际的使用内存寻址.也是在那个时候知道不能使用未初始化的指 ...

  9. Windows内存管理简介:

    1:连续的内存空间分配: (1)单一连续分配:只能单作业,单任务运行: 分为系统和用户区:用户区是指除了系统需外左右的内存,由于单用户,单任务,要不都被占用,要不全空   (2):固定空间分配:固定分 ...

  10. Windows程序设计学习笔记(一)Windows内存管理初步

    学习Windows程序设计也有一些时间了,为了记录自己的学习成果,以便以后查看,我希望自己能够坚持写下一系列的学习心得,对自己学习的内容进行总结,同时与大家交流.因为刚学习所以可能有的地方写不不正确, ...

随机推荐

  1. 9-9-B+树-查找-第9章-《数据结构》课本源码-严蔚敏吴伟民版

    课本源码部分 第9章  查找 - B+树 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题 ...

  2. kafka项目中踩到的一个坑(客户端和服务器端版本不一致问题)

    启动项目时控制台抛出的异常信息: -- :: --- [ main] o.s.s.c.ThreadPoolTaskScheduler : Initializing ExecutorService 't ...

  3. 实现div里的img图片水平垂直居中

    body结构 <body> <div> <img src="1.jpg" alt="haha"> </div> ...

  4. Hadoop 2.x 安装常见问题FAQ(一) NodeManager 无法启动问题解决

    一.问题描述 在搭建 Hadoop hadoop-2.4.1 集群的最后一步启动集群,在命令窗口并没有报任何错误,但是Slave 节点的 NodeManager进程始终启动不起来.随后查看了后台启动日 ...

  5. 【emWin】例程三十一:窗口对象——Multipage

    简介: ULTIPAGE 类似于笔记本中的分隔卡或文件柜中的标签.通过使用MULTIPAGE 小工具,应用程序可为窗口或对话框的相同区域定义多个页面.每个页面包含特定 类型的信息或用户选择相应页面时应 ...

  6. jQuery移除或禁用html元素点击事件常用方法小结

    移除或禁用html元素的点击事件可以通过css实现也可以通过js或jQuery实现. 一.CSS方法 .disabled { pointer-events: none; } 二.jQuery方法 方法 ...

  7. windows下添加多个git仓库账号

    当使用git方式下载时,如果没有配置过ssh key,会提示错误(git clone支持https和git(即ssh)两种方式下载源码) 当需要在机器上使用不同的git账户,这就需要知道如何在机器上添 ...

  8. es6在项目中的应用

    摘要: 今年es6完成了规范制定,但是各大浏览器厂商还没有完全的支持.如果等到主流浏览器支持了再去学习,可能黄花菜都凉了.小编特地为大家准备了一个查询es6在各浏览器支持情况的站点,可以访问这里查询. ...

  9. AndroidのInputFillter之按字符过滤长度,一个中文当两个字符

    /** * 以Byte数的方式来实现的LengthFilter * @author bvin */ public class OneByteInputFilter implements InputFi ...

  10. rar压缩find查找到的文件

    find . -name 'CMakeLists.txt' | xargs /d/Program\ Files/WinRAR/rar.exe a -r ./out.rar $ ------------ ...