博客 > 硬件&操作系统
# Windows 资源监视器内存指标详解 ![](/resource/hash_313454c5d3eb585e059020f28de12309) 如图所示,Windows 资源监视器(注意不是资源管理器Explorer)的“内存”选项卡中有**提交/工作集/可共享/专用**四列数据,还有一个直观的内存用量条,其中有**为硬件保留的内存/正在使用/已修改/备用/可用**四种图例,这一条底下还有**可用/缓存/总数/已安装**四行文字总结。这些指标分别代表什么呢?都有什么用呢? ## Windows的内存管理 简单来讲,Windows使用的是虚拟存储器+分页交换的策略,可以认为和操作系统课程里讲的请求分页、交换这些知识点恰好吻合。而每个进程可以放置在物理内存中的空间是动态的,可以简单理解为进程占用的页框数是动态的。 ## 进程的内存用量指标 ![](/resource/hash_ccf397c55c50c398f2f57ba0760b1e87) - **硬中断**:啥也别说了,就是缺页。 - **提交**:操作系统为进程保留的虚拟内存量(也即在硬盘上交换文件里占用的空间)。这个字段是与Windows虚拟内存分配算法相关联的,不代表任何内存指标。但对用户程序来讲,一般**提交大小**会略大于**工作集大小**,如果远大于,则有可能发生了内存紧张,或内存泄露。当然系统程序不遵守这个大小关系,比如`Memory Compression`进程几乎没有提交大小,但工作集大小很大。 - **工作集**:进程当前使用的物理内存量 - **可共享**:进程当前使用的物理内存中,可与其他进程共享的部分(如静态资源)。注意别的进程的内存使用量不会和这块空间产生任何关系,这块空间本质上还是单独属于该进程的,只是别的进程可以访问而已。 - **专用**:进程当前使用的物理内存中,不可与其他进程共享的部分(如程序代码) 其中有如下两个等式关系: - **专用** $\subset$ **提交** - **工作集** = **可共享** + **专用** ## 内存用量条中的图示 ![](/resource/hash_e91cc394b7284690c594d032ec735c5b) - **为硬件保留的内存**:顾名思义即可。用内存来扩展显存的功能(常见于A卡)被归到了这一类中。32位机上因地址长度原因无法使用的内存区域(4G及以上)也被归到了这一类中。 - **正在使用的内存**:当前使用中的物理内存总量,经计算与所有进程**工作集**内存之和基本相等,但略大一些(可能是含有系统内核自用部分) - **已修改**:缓冲区,准备写入外存的部分。 - **备用**:为加快新进程的启动速度而配置的缓存策略(微软Superfetch技术)所使用内存,**“内存过分多余的空闲容量就是性能的浪费”**,一般占据绝大多数内存空间。这是一种策略性的、非占用的内存利用,与各个用户进程和系统内核执行性的、独占的内存使用有所区别。总而言之,**此部分内存实际上属于可用内存**,别被吓到。 - **可用**:没被**备用**所占掉的空闲空间。按照简单化的Windows内存管理策略来描述,在开辟一块新空间时,最优先使用的是这部分内存,其次使用**备用**部分内存,然后才会大规模执行压缩、交换等策略(这时候电脑应该已经快不行了)。实际上我觉得这里命名为“**空闲**”会更贴切,也与下面的四行数据区分。 ## 内存用量条下方的四行数据 ![](/resource/hash_57f9ff026637d8a0c331c98b79529e56) - **可用** = **备用** + **可用**。这就是我说为什么上一个**可用**应该叫**空闲**的原因,在这里命名冲突了。 - **缓存** = **已修改** + **备用**。我觉得这里可以理解为**已修改**是准备从内存写入外存的**写缓冲区**,而**备用**有点从外存读入内存的**读缓冲区**的那个意思,所以都算作**缓存**。 - **总数** = **正在使用** + **已修改** + **备用** + **可用**。也即除了**为硬件保留的内存**都算在**总数**里。 - **已安装** = **总数** + **为硬件保留的内存**。也即物理内存的100%。如果你全插的是GB量级的内存条,它将恰好是1GB的整数倍,一个子儿都没有浪费! ## 资源监视器自带的解释 上面是我自己总结的释义,资源监视器中也有全面的ToolTips,把鼠标放上去就会显示,可以对照看看。