原文地址:Windows任务管理器中内存使用、虚拟内存区别及与页面文件的关系

虚拟内存(VirtualMemory)是Windows管理所有可用内存的方式。对于32位Windows系统,每个进程所用到的虚拟内存地址从0到2^32-1,总容量4GB,其中2GB是与操作系统以及其他所有进程所共享,另外2GB分派给进程独占(这就是常说的32位Windows中一个进程最多能用2G内存的由来)。   

4GB虚拟地址空间(Virtual AddressSpace,VAS)中,2GB的进程独占VAS是进程隔离的,换句话说,每个进程都可以从RAM或者硬盘上映射到属于自己的2GBVAS。所以虽然32位Windows每个进程最多只能获得4GB可用虚拟内存,但是所有进程总和可以使用总量超过4GB的虚拟内存。可惜XP只支持4GB RAM,也就是说超出部分一定得靠页面文件补足;而比如2003企业版通过PAE支持32GBRAM,可以减少页面文件的用量。(但单个进程最多仍然只有4GB虚拟内存地址空间,而不是32GB)   

所以,一个简单的计算示例:三个进程最多能用掉多少VAS?  

2GB(共享)+2GB(独占)×3=8GB   

这4GB的虚拟地址空间,按照4KB的大小进行分页(page),然后以页为单位映射到实际存储单元中,包括:  

·物理内存(RAM)  

·页面文件(Page File,在Win9x中称为交换文件Swap File,即win386.swp)  

·其他文件自身(比如一些长时间未活动的进程的exe文件自身)  

可见,通常人们所说的虚拟内存实际上只是指其中的页面/交换文件而已,这是对虚拟内存的一个错误的理解。虚拟内存≠页面文件   RAM中除了保存最近读写的文件缓存(FileCache,相当于Win9x中的Vcache)主要用来存储正在使用的程序代码和数据,当RAM资源紧张,或者有程序码或数据长时间未使用时,XP通常会将非活跃程序码所在的地址页映射回程序文件(exe、dll等),将数据所在的地址页映射到页面文件(pagefile.sys)中并拷贝数据,然后将它们本来占用的RAM空间释放。这个过程称为页出(Page Out)。   

当系统读取某个虚拟内存地址,而该地址所在的页不在RAM中时,将产生一个页面错误(PageFault)中断,告诉系统从页面文件或者程序文件中取回包含该地址的虚拟内存页,即将内容拷回到RAM并建立新的虚拟地址映射,并将页面文件中对应部分标记为未使用,这个过程就是页入(Page In)。页入成功的话就是一个Valid Page Fault,否则就是Invalid PageFault。前者非常普遍,(可以在任务管理器的进程页监视到)而后者是由程序或硬件错误引起,如果发生在进程上会导致非法操作,如果是系统自身则很可能蓝屏。   

内存用量可以在任务管理器的性能页中看到。其中物理内存的总量、可用数等是指安装的RAM容量和剩余RAM容量,而内存使用(2000下的正确翻译,M注)或者提交更改(XP下的错误翻译,M注)的总量和限制是指虚拟内存的Commit Limit和CommittedBytes,可以理解成系统可以使用的虚拟内存总量和当前使用量,其中总量是由RAM大小+页面文件大小决定的。   

而在任务管理器的进程页中,“内存使用”和“虚拟内存大小”造成的误解很多,而实际上,这两个值是对应性能监视器中该进程的WorkingSet和Private Bytes,WorkingSet是指一个进程的4GB虚拟地址空间中被映射到RAM中的部分的大小,通常是该进程的虚拟内存中的活跃部分。表面看来这个表述和“进程占用的RAM大小”没有太大区别,但至少有两种情况导致了例外的发生:第一种是这部分虚拟内存如果是属于2G的系统共享虚拟内存,那么它映射到的RAM地址可能和其他进程有重复,计算多个进程占用RAM总和就不正确,使得所有进程的WorkingSet之和比实际占用RAM要大。第二种是一个进程中可能有同一段RAM内容的多个引用,比如一个文件被loop多次,此时虚拟空间中会有多段地址被映射到同一段RAM上,从而造成该进程的Working Set比实际占用RAM要大。Private Bytes是一个进程的2GB独占虚拟地址空间中用到的部分的大小,无论这部分是在RAM中还是在页面文件中,甚至是在exe、dll等文件中。所以,任务管理器进程页中的虚拟内存绝对不反映pagefile.sys的用量。   

所以,任务管理器无论是进程页还是性能页都不能直接反映pagefile的使用情况,诸如“关掉pagefile还能看到虚拟内存”之类的疑问,应该很清楚了。   

(再次抱怨一下Windows中文版糟糕的专业术语翻译,M注)   

下面是一个简单图示,两个进程,各自拥有2G独占VAS,共同拥有2G共享VAS,W代表映射到RAM中的部分(Working Set),P代表页出的部分。

0 …………………2GB独占VAS………………… 2G ………2GB共享VAS……… 4G

进程1 |-----PPPP------------WW-----PPPP--------|

//// || ////

//// || //// --PPPPPPPPPPPP--WWWWWWWW--|

//// || |||| | ||||||||||| |||||||| (exe2磁盘exe1) RAMemory PageFile | 共享内核/dll等 共享RAM空间

|||| |||| || |

进程2 |-PPPP-----------WWWW---------PP----P----|   

然后,任务管理器的进程页中的“内存”就是上图中的W,所以所有进程的内存项加起来肯定比实际用的RAM大,因为有共享部分此外还有重复引用。而任务管理器进程页中的“虚拟内存”就是上图中左半部分,“独占VAS”。可见pagefile只是其中的一部分,而RAM,只要用于独占VAS,一样计入了该处“虚拟内存”。   最后,实际的页面文件用量(pagefile.sys中实际使用部分),可以在性能监视器中看到,即Paging File下的% Usage和%Usage Peak配合当前pagefile.sys的大小就可以计算出字节数,这个值可以做为设定页面文件最小值的一个参考,而不是用任务管理器进程页的所有进程的虚拟内存大小相加做为页面文件最小值的参考。

Windows任务管理器中内存使用、虚拟内存区别及与页面文件的关系的更多相关文章

  1. Windows 任务管理器中的几个内存概念

    我们使用的大部分 PC 是基于 Intel 微处理器的 x86 和 x64 架构计算机. 因此, 我们面对的 windows 避免不了和 Intel 架构有些设计上的契合. 比如接下来要说到的内存管理 ...

  2. [转载]windows任务管理器中的工作设置内存,内存专用工作集,提交大小详解

    windows任务管理器中的工作设置内存,内存专用工作集,提交大小详解 http://shashanzhao.com/archives/832.html 虽然是中文字,但是理解起来还是很困难,什么叫工 ...

  3. windows任务管理器中的工作设置内存,内存专用工作集,提交大小详解

    虽然是中文字,但是理解起来还是很困难,什么叫工作设置内存,什么叫内存专用工作集,什么叫提交大小,区别是什么,让人看了一头雾水. 通俗的讲工作设置内存是程序占用的物理内存(包含与其他程序共享的一部分), ...

  4. Windows系统中内存泄露与检测工具及方法

    1.检测需要使用的工具:windbg工具.检测前,需要先安装windbg工具.安装了该工具后,会在安装目录下有一个umdh工具.假设windbg安装在以下目录下:D:\Program Files\De ...

  5. [转]Win7、Windows Server 2008下无法在Windows Service中打开一个已经存在的Excel 2007文件问题的解决方案

    昨天,组里一个小朋友告诉我,他写的报表生成服务中无法打开一个已经存在的Excel 2007文件,他的开发环境是Win7.Visual Studio .Net 2008(Windows Server 2 ...

  6. windows系统中如何找到某程序运行的本地文件

    主要通过window自带的服务功能来查询: 比如:

  7. Windows Server 2008 R2服务器内存使用率过高,但与任务管理器中进程占用内存和不一致

    系统环境: Windows Server 2008 R2 + Sql Server 2008 R2   问题描述: Windows Server 2008 R2系统内存占用率过大,而在任务管理器中各进 ...

  8. (十一)C语言中内存堆和栈的区别

    在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到.但对于很多的初学着来说,堆栈是一个很模糊的概念. 堆栈:一种数据结构.一个在程序运行时用于存放的地方,这可能是很多初学者的认 ...

  9. Windows系统中CreateFileMapping实现的共享内存及用法

    在32位的Windows系统中,每一个进程都有权访问他自己的4GB(232=4294967296)平面地址空间,没有段,没有选择符,没有near和far指针,没有near和far函数调用,也没有内存模 ...

随机推荐

  1. javase

    http://blog.csdn.net/itlwc/article/category/1572517 http://blog.csdn.net/itlwc

  2. hdu_5877_Weak Pair(离散+DFS+树状数组)

    题目链接:hdu_5877_Weak Pair 题意: 给你一棵树,让你找有多少对满足那两个条件的weak pair 题解: 有人用Treap,我不会,然后我用树状数组+离散来替代Treap,用DFS ...

  3. 3、Web应用程序中的安全向量 -- cookie盗窃

    作为用户,为了防止cookie盗窃,可以在浏览器设置中选择"禁用cookie",但是这样做很可能导致在访问某个站点的时候弹出警告"该站点必须使用cookie". ...

  4. openwrt下关于snmpd的一些信息

    cd /tmp/ 上传: tftp -gr libnetsnmp_5.4.4-1_ar71xx.ipk 192.168.11.56 安装: opkg install libnetsnmp_5.4.4- ...

  5. web页面开发相关基础

    CSS是一种用于web的标准布局语言,可以控制版面.颜色以及元素和图像的大小和位置.HTML文档应该利用外部样式表来定义文档中使用的样式.JavaScript也应该放在外部文档中,这个文档应该只包含J ...

  6. Java实现二分查找算法

    Java程序员总该玩点基本的算法. 1.前提:二分查找的前提是需要查找的数组必须是已排序的,我们这里的实现默认为升序 2.原理:将数组分为三部分,依次是中值(所谓的中值就是数组中间位置的那个值)前,中 ...

  7. ADO.NET基础、数据增删改查

    ADO.NET:数据访问技术,就是将C#和MSSQL连接起来的一个纽带.我们可以通过ADO.NET将内存中的临时数据写入到数据库中,也可以将数据库中的数据提取到内存中供程序调用. 数据库数据的增.删. ...

  8. Python 学习笔记11

    如何要飞得高,就该把天空忘掉.如果时时想着梦想,那就寸步难行.因为会产生很强的挫败感.倾空自己的杯子,把自己放空,才能放得进去东西. 这两天一直在鼓捣要用python写一个博客出来.先是下载了一个放到 ...

  9. Quartz(任务调度)- 入门学习

    参照:http://blog.csdn.net/szwangdf/article/details/6158646 1.自定义定时任务管理类 QuartzManager 参照大神基础上新增:1.添加jo ...

  10. sfs - django start from scratch

    [TOC] Launch with code git spreading is obsolte lwc Installation Path D:\PythonWebSW\Django-1.5.5 ad ...