Windows 内存管理
参考文献:
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
// WindbgCmdTest.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
using namespace std;
#pragma comment(lib,"Psapi.lib")
#include <Psapi.h>
#define MEM_M (1024*1024)
void OutputSystemMem(MEMORYSTATUS New, MEMORYSTATUS Old)
{
//cout<<"减少物理内存="<<(New.dwAvailPhys-Old.dwAvailPhys)/MEM_M<<endl;
//cout<<"减少可用页文件="<<(New.dwAvailPageFile-Old.dwAvailPageFile)/MEM_M<<endl;
//cout<<"减少可用进程空间="<<(New.dwAvailVirtual-Old.dwAvailVirtual)/MEM_M<<endl;
}
static PROCESS_MEMORY_COUNTERS stLastMem;
void OutputProcessMem()
{
PROCESS_MEMORY_COUNTERS pro;
HANDLE handle = GetCurrentProcess();
GetProcessMemoryInfo(handle, &pro, sizeof(pro));
cout<<"缺页中断次数 "<<"new("<<pro.PageFaultCount/MEM_M<<") "<<"old("<<stLastMem.PageFaultCount/MEM_M<<")"<<endl;
cout<<"使用内存高峰 "<<"new("<<pro.PeakWorkingSetSize/MEM_M<<") "<<"old("<<stLastMem.PeakWorkingSetSize/MEM_M<<")"<<endl;
cout<<"当前使用的内存 "<<"new("<<pro.WorkingSetSize/MEM_M<<") "<<"old("<<stLastMem.WorkingSetSize/MEM_M<<")"<<endl;
cout<<"使用页面缓存池高峰 "<<"new("<<pro.QuotaPeakPagedPoolUsage/MEM_M<<") "<<"old("<<stLastMem.QuotaPeakPagedPoolUsage/MEM_M<<")"<<endl;
cout<<"使用页面缓存池 "<<"new("<<pro.QuotaPagedPoolUsage/MEM_M<<") "<<"old("<<stLastMem.QuotaPagedPoolUsage/MEM_M<<")"<<endl;
cout<<"使用非分页缓存池高峰 "<<"new("<<pro.QuotaPeakNonPagedPoolUsage/MEM_M<<") "<<"old("<<stLastMem.QuotaPeakNonPagedPoolUsage/MEM_M<<")"<<endl;
cout<<"使用非分页缓存池 "<<"new("<<pro.QuotaNonPagedPoolUsage/MEM_M<<") "<<"old("<<stLastMem.QuotaNonPagedPoolUsage/MEM_M<<")"<<endl;
cout<<"使用分页文件(提交的内存文件大小) "<<"new("<<pro.PagefileUsage/MEM_M<<") "<<"old("<<stLastMem.PagefileUsage/MEM_M<<")"<<endl;
cout<<"使用分页文件高峰 "<<"new("<<pro.PeakPagefileUsage/MEM_M<<") "<<"old("<<stLastMem.PeakPagefileUsage/MEM_M<<")"<<endl;
cout<<endl;
memcpy(&stLastMem,&pro,sizeof(pro));
}
#define VIRTUAL_ALLOC_TEST_SIZE 10*MEM_M
int _tmain(int argc, _TCHAR* argv[])
{
memset(&stLastMem,0,sizeof(stLastMem));
OutputProcessMem();
MEMORYSTATUS memStatusVirtual;
GlobalMemoryStatus(&memStatusVirtual);
LPVOID pV=VirtualAlloc(NULL,VIRTUAL_ALLOC_TEST_SIZE,MEM_RESERVE|MEM_TOP_DOWN,PAGE_READWRITE);
if(pV==NULL)
{
cout<<"没有那么多虚拟空间!"<<endl;
}
MEMORYSTATUS memStatusVirtual1;
GlobalMemoryStatus(&memStatusVirtual1);
cout<<"VirtualAlloc(NULL,1000*1024*1024,MEM_RESERVE|MEM_TOP_DOWN,PAGE_READWRITE);"<<endl;
OutputSystemMem(memStatusVirtual1,memStatusVirtual);
OutputProcessMem();
cout<<"\n";
pV=VirtualAlloc(pV,VIRTUAL_ALLOC_TEST_SIZE,MEM_COMMIT,PAGE_READWRITE);
if (pV == NULL)
{
DWORD eLastError = GetLastError();
cout <<"eLastError: %d" << eLastError;
}
MEMORYSTATUS memStatusVirtual2;
GlobalMemoryStatus(&memStatusVirtual2);
cout<<"VirtualAlloc(pV,10*1024*1024,MEM_COMMIT|MEM_RESERVE,PAGE_READWRITE);"<<endl;
OutputSystemMem(memStatusVirtual2,memStatusVirtual1);
OutputProcessMem();
char * pC = (char *)pV;
cout<<"\n";
cout<<"pC[VIRTUAL_ALLOC_TEST_SIZE-1] = 0;;"<<endl;
pC[VIRTUAL_ALLOC_TEST_SIZE-1] = 0;
OutputProcessMem();
cout<<"\n";
char * p = new char[10*MEM_M];
MEMORYSTATUS memStatusVirtual8;
GlobalMemoryStatus(&memStatusVirtual8);
cout<<"char * p = new char[10*MEM_M];"<<endl;
OutputSystemMem(memStatusVirtual8,memStatusVirtual2);
OutputProcessMem();
cout<<"\n";
VirtualFree(pV,VIRTUAL_ALLOC_TEST_SIZE,MEM_DECOMMIT);
MEMORYSTATUS memStatusVirtual3;
GlobalMemoryStatus(&memStatusVirtual3);
cout<<" VirtualFree(pV,10*1024*1024,MEM_DECOMMIT);"<<endl;
OutputSystemMem(memStatusVirtual3,memStatusVirtual2);
OutputProcessMem();
cout<<"\n";
VirtualFree(pV,VIRTUAL_ALLOC_TEST_SIZE,MEM_RELEASE);
MEMORYSTATUS memStatusVirtual4;
GlobalMemoryStatus(&memStatusVirtual4);
cout<<"VirtualFree(pV,10*1024*1024,MEM_RELEASE);"<<endl;
OutputSystemMem(memStatusVirtual4,memStatusVirtual3);
OutputProcessMem();
cout<<"\n";
VirtualUnlock(pV,VIRTUAL_ALLOC_TEST_SIZE);
MEMORYSTATUS memStatusVirtual5;
GlobalMemoryStatus(&memStatusVirtual5);
cout<<"VirtualUnlock(pV,10*1024*1024);"<<endl;
OutputSystemMem(memStatusVirtual5,memStatusVirtual4);
OutputProcessMem();
cout<<"delete[] p;"<<endl;
delete[] p;
OutputProcessMem();
getchar();
return 0;
}
Windows 内存管理的更多相关文章
- Windows内存管理[转]
本文主要内容:1.基本概念:物理内存.虚拟内存:物理地址.虚拟地址.逻辑地址:页目录,页表2.Windows内存管理3.CPU段式内存管理4.CPU页式内存管理 一.基本概念1. 两个内存概念物理内存 ...
- windows内存管理方式以及优缺点
Windows内存管理方式:页式管理,段式管理,段页式管理 页式管理 将各进程的虚拟空间(逻辑地址)划分为若干个长度相等的页,业内管理把内存空间(物理内存)按照页的大小划分为片或者页面,从而实现了离散 ...
- windows 内存管理的几种方式及其优缺点
windows 内存管理方式主要分为:页式管理,段式管理,段页式管理. 页式管理的基本原理是将各进程的虚拟空间划分为若干个长度相等的页:页式管理把内存空间按照页的大小划分成片或者页面,然后把页式虚拟地 ...
- 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
本文背景: 在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用:根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制. 本 ...
- Windows内存管理的方式
一.内存的概念 1. 物理内存:即插在主板上的内存条.他是固定的,内存条的容量多大,物理内存就有多大(集成显卡系统除外). 但是如果程序运行很多或者程序本身很大的话,就会导致大量的物理内存占用,甚至导 ...
- 20140919 进程间通信 系统栈 用户栈 多级反馈队列 windows 内存管理
1.进程间通信 共享内存(剪切板) 匿名管道只能实现父子进程间的通信(以文件系统为基础): 匿名管道是什么,有什么用,怎么用 1.创建父进程,也就是在解决方案中建立一个parent的工程 2.在par ...
- 全面介绍Windows内存管理机制及C++内存分配实例
转自:http://blog.csdn.net/yeming81/article/details/2046193 本文基本上是windows via c/c++上的内容,笔记做得不错.. 本文背景: ...
- Windows内存管理
本博文很大程度上参考了,潘爱民先生的<Windows内核原理与实现>一书,在此对他表示感谢. 记得是在学C语言指针的时候,首次比较实际的使用内存寻址.也是在那个时候知道不能使用未初始化的指 ...
- Windows内存管理简介:
1:连续的内存空间分配: (1)单一连续分配:只能单作业,单任务运行: 分为系统和用户区:用户区是指除了系统需外左右的内存,由于单用户,单任务,要不都被占用,要不全空 (2):固定空间分配:固定分 ...
- Windows程序设计学习笔记(一)Windows内存管理初步
学习Windows程序设计也有一些时间了,为了记录自己的学习成果,以便以后查看,我希望自己能够坚持写下一系列的学习心得,对自己学习的内容进行总结,同时与大家交流.因为刚学习所以可能有的地方写不不正确, ...
随机推荐
- python 列表排序方法sort、sorted技巧篇
Python list内置sort()方法用来排序,也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列. 1)排序基础 简单的升序排序是非常容易的.只需要调用sorte ...
- border绘制三角形
(1)有边框的三角形 我们来写下带边框的三角形. 如果是一个正方形,我们写边时,会用到border,但我们这里讨论的三角形本身就是border,不可能再给border添加border属性,所以我们需要 ...
- C#学习笔记(33)——批量修改word标题
说明(2017-12-22 11:20:44): 1. 因为数学脚本的主标题和副标题没有格式,目录导航里不显示,修改的时候不好定位,所以需要改成下图格式: 2. 问题的难点有两个,一个是word的操作 ...
- Android Launcher分析和修改12——Widget列表信息收集
很久没写Launcher分析的文章,最近实在太忙.今天七夕本来是想陪女朋友逛街 ,碰巧打台风呆在家里,就继续写一篇文章.今天主要是讲一下Launcher里面的Widget列表,这方面信息比较多,今天重 ...
- 第三百九十五节,Django+Xadmin打造上线标准的在线教育平台—Xadmin集成富文本框
第三百九十五节,Django+Xadmin打造上线标准的在线教育平台—Xadmin集成富文本框 首先安装DjangoUeditor3模块 Ueditor HTML编辑器是百度开源的HTML编辑器 下载 ...
- java.sql.SQLException: ORA-01578: ORACLE 数据块损坏问题解决办法
错误信息: java.sql.SQLException: ORA-01578: ORACLE 数据块损坏 (文件号 17, 块号 315703) ORA-01110: 数据文件 17: 'D:\ORA ...
- php 页面间传递数据
b.php <?php function getClientIP() { if (getenv("HTTP_CLIENT_IP")) $ip = getenv("H ...
- Windows 8(64位)如何搭建 Android 开发环境与真机测试(转)
可以参考http://wenku.baidu.com/link?url=ghU6IFS1WJXLFKfM_0efv9YQEnMDBrdi9CXwirSs5IOLLeUfdIOh8OOVv0DX89Lt ...
- html5游戏开发-简单tiger机
http://blog.csdn.net/lufy_legend/article/details/7021965
- 【03月04日】A股滚动市盈率PE历史新低排名
2010年01月01日 到 2018年12月05日 之间,滚动市盈率历史新低排名. 上市三年以上的公司,2018年12月05日市盈率在300以下的公司. 1 - 青松股份(SZ300132) - 历史 ...