# Windows 资源监视器内存指标详解
> 菜谱放最前面:
>
> 1. 查看物理内存占用:看“工作集”,工作集就是物理内存占用
> 2. 查看内存泄漏:看“提交”,是否严重超大
> 3. 查看内存压力:可用内存看蓝条+白条的总和(单看白条无意义),还看硬中断和磁盘IO

如图所示,Windows 资源监视器(注意不是资源管理器Explorer)的“内存”选项卡中有**提交/工作集/可共享/专用**四列数据,还有一个直观的内存用量条,其中有**为硬件保留的内存/正在使用/已修改/备用/可用**四种图例,这一条底下还有**可用/缓存/总数/已安装**四行文字总结。这些指标分别代表什么呢?都有什么用呢?
## Windows的内存管理
简单来讲,Windows使用的是虚拟存储器+分页交换的策略,可以认为和操作系统课程里讲的请求分页、交换这些知识点恰好吻合。而每个进程可以放置在物理内存中的空间是动态的,可以简单理解为进程占用的页框数是动态的。
## 表头字段的含义

- **硬中断**:啥也别说了,硬中断就是操作系统课程里学过的缺页。
- **提交**:进程的虚拟内存量。这个字段是与Windows虚拟内存分配算法相关联的,不代表任何内存指标。对用户程序来讲,**提交**一定会略大于**工作集**,如果远大于,则有可能发生了内存紧张或内存泄露。系统程序有可能不遵守这个大小关系,比如`Memory Compression`这个进程几乎没有提交大小,但工作集大小很大。
- **工作集**:进程当前使用的物理��存量
- **可共享**:工作集中,可与其他进程共享的部分(个人猜测可能是静态资源之类的)。注意别的进程的内存使用量不会和这块空间产生任何关系,这块空间本质上还是单独属于该进程的,只是别的进程可以访问而已。
- **专用**:工作集中,不可与其他进程共享的部分(如程序代码)
有如下两个关系:
- **工作集** $\subset$ **提交**
- **工作集** = **可共享** + **专用**
## 内存用量条

- **为硬件保留的内存**:顾名思义即可。比如我家A卡用内存来扩展显存的部分被归到了这一类中,32位机上无法使用的内存区域(4G及以上)也被归到了这一类中。
- **正在使用的内存**:当前使用中的物理内存总量,经计算与所有进程**工作集**的总和基本相等,但略大一些(可能是含有系统内核部分)
- **已修改**:写缓冲区。准备写入外存的数据。
- **备用**:读缓冲区+为加快新进程的启动速度而配置的缓存(微软Superfetch技术)。**“多余的空闲容量就是性能的浪费”**,这是一种策略性的、非占用性的内存利用。总而言之,**此部分内存实际上属于可用内存**,别被吓到。
- **可用**:没被**备用**所占掉的空闲空间。��开辟一块新空间时,最优先使用的是这部分内存,其次使用**备用**部分内存,然后才会大规模执行压缩、交换等策略(这时候电脑应该已经快不行了)。实际上我觉得这里命名为“**空闲**”会更贴切,也与下面的四行数据区分。
## 内存用量条下方的四行数据

- **可用** = **备用** + **可用**。这就是我说为什么上一个**可用**应该叫**空闲**的原因,在这里命名冲突了。
- **缓存** = **已修改** + **备用**。我觉得这里可以理解为**已修改**是准备从内存写入外存的**写缓冲区**,而**备用**有点从外存读入内存的**读缓冲区**的那个意思,所以都算作**缓存**。
- **总数** = **正在使用** + **已修改** + **备用** + **可用**。也即除了**为硬件保留的内存**都算在**总数**里。
- **已安装** = **总数** + **为硬件保留的内存**。也即物理内存的100%。如果你全插的是GB量级的内存条,它将恰好是1GB的整数倍,一个子儿都没有浪费!
## 资源监视器自带的解释
上面是我自己总结的释义,资源监视器中也有全面的ToolTips,把鼠标放上去就会显示,可以对照看看。