更新记录(1 条,最后更新 2026年09月03日)
本文的修改记录。已保存的更新前版本,可通过带有 DOI 的永久链接阅读。
- 修复了 `<details>` 元素内的代码示例以 ``` 原始记号显示的问题。 查看更新前的版本 (DOI: 10.5281/zenodo.22176127)
- 首次发布
引用本文(DOI(已登记存档): 10.5281/zenodo.22176126)
以下 DOI 指向先前登记的存档,内容可能与当前正文不同。引用当前正文时,请使用本页网址。
Go Komura(2026)。《Windows 内存底层原理(第 2 篇)——物理页的一生:五个列表与页面文件的真相》。小村软件有限公司。 https://comcomponent.com/zh-CN/blog/windows-memory-internals-page-lifecycle-pagefile/
- DOI(已登记存档)
- 10.5281/zenodo.22176126
- DOI(上次登记版本)
- 10.5281/zenodo.22279028
“Working Set 变小了,那这些页是不是已经不在 RAM 里了?”第 2 篇就从物理页这一侧追踪这个疑问。
上一篇“Windows 内存底层原理(第 1 篇)——虚拟地址变成物理 RAM 的瞬间”看到的,是已 Commit 的页在首次访问时取得物理页为止。页离开 Working Set 之后,并不一定立刻消失,也不一定立刻转到页面文件。
未修改的页可以带着内容移到 Standby。已修改的页会先在 Modified 等待写回。重用时可能经过 Free 或 Zeroed;如果再次需要同一份内容,也可以从 Standby 通过软页错误回来。
本文以 PFN 数据库为轴,串联一张物理页在 Active、Modified、Standby、Free、Zeroed 之间的状态。数字本身怎么读,以入门篇“Windows 的‘内存使用量’究竟表示什么”为前提。
“Windows 内存底层原理”系列共三篇
本系列按取得物理页 → 追踪常驻与回收的流程 → 理解共享与私有化的顺序展开。
| 篇次 | 主题 | 本篇追踪的内容 |
|---|---|---|
| 第 1 篇 | 虚拟地址与页错误 | VirtualAlloc 分配的区域何时取得物理 RAM |
| 第 2 篇(本文) | 物理页的一生 | 离开 Working Set 的页的状态转换,以及页面文件的作用 |
| 第 3 篇 | 节对象与写时复制 | DLL、文件映射、共享内存如何共享物理页 |
第 2 篇要回答的疑问只有一个。
离开 Working Set 的物理页,是消失了,是去了磁盘,还是留在 RAM 里。
| 开始阅读之前 | 内容 |
|---|---|
| 目标读者 | 想从机制上理解 Available 与 Standby 的关系、Working Set 裁剪后的行为、页面文件配置和内存压缩的开发者与运维人员 |
| 前提环境 | Windows 10/11 或现行 Windows Server |
| 前提知识 | Working Set、Commit、软页错误与硬页错误的基础 |
| 难度 | 中级。会用到 PFN、页列表这类内部术语 |
讲解以不用内核调试器、靠 RAMMap 和 PerfMon 就能观察的范围为主。
图中实线表示始终成立的关系,虚线表示带条件的关系(成立条件写在详情页各关系的说明中)。关系的完整列表(共 18 条,附依据与确信度)以及主要概念的定义,汇总在知识地图详情页(日文)。数据:JSON-LD / Turtle
1. 先给结论
物理页的去向,可以用下面 3 点来梳理。
- 把页移出 Working Set,和丢失内容是两回事。 干净页留在 Standby,需要同一份内容时不读磁盘就能回来。已修改的页则要先让内容能保存在页面文件或对应文件等位置,之后才会被重用。
- Standby 既是缓存,同时也计入 Available。 它保留着之前的内容,但别处需要时就可以被重用。Available 包含 Standby、Free、Zeroed。1
- 页面文件不只是写出目的地,它还支撑着 Commit 和转储。 写出并不是等 RAM 彻底耗尽后的一次性处理,而是按 Modified 列表和内存压力在后台推进。禁用它修不好泄漏,反而可能压低 Commit Limit、减少重用 RAM 的选择,并削弱获取转储的能力。234
用一句话概括就是:Windows 在丢弃一张页之前,会确认它再次被需要的可能性,以及原内容能从哪里恢复。
| 想了解的内容 | 阅读的章节 |
|---|---|
| 离开 Working Set 的页去了哪里 | 第 2~6 节 |
| Standby、Free、Zeroed 与压缩的区别 | 第 7~8 节 |
| 想判断页面文件的必要性与大小 | 第 9~10 节 |
| 想用 RAMMap 或 Testlimit 亲自验证 | 第 11~12 节 |
2. PFN 数据库——物理 RAM 一侧的台账
第 1 篇看到的 PTE,表示的是从虚拟页到物理页的转换。反过来从物理页一侧看,用来追踪“这张 RAM 页现在被用在哪里”的台账就是 PFN 数据库。PFN 是 Page Frame Number 的缩写,指把物理 RAM 按页编号后的编号。
PFN 条目在概念上追踪下面这些信息。
- 物理页的当前状态
- 引用数和共享数
- 对应的 PTE
- 是否已修改
- 属于哪个页列表
- 与 NUMA 节点和优先级相关的信息
按要看的粒度选择工具的显示项。 用 WinDbg 和 RAMMap 可以这样查看。567
| 想确认的内容 | 显示项或命令 |
|---|---|
| 特定 PFN 的信息 | WinDbg 的 !pfn |
| 物理内存的使用情况与页列表汇总 | WinDbg 的 !memusage |
| 用途与页列表 | RAMMap 的 Use Counts |
| 按优先级细分的 Standby | RAMMap 的 Priority Summary |
| 逐页的使用情况 | RAMMap 的 Physical Pages |
用 RAMMap 的话,不动内核调试器也能观察。
3. 把五种状态串成一张图
这里把物理页的流转简化成五种状态。先按“现在能不能用”“有没有留着内容”“重用前还要不要准备”来区分。
| 状态 | 本篇的理解方式 |
|---|---|
| Active / Valid | 通过有效 PTE,正被 Working Set 等引用 |
| Modified | 已修改,等待写回 |
| Standby | 保留着之前的内容,可被重用的候选 |
| Free | 可以分配,但页内可能残留旧的位串 |
| Zeroed | 已清零,可以作为新的用户模式页交出去 |
这张图并没有列举全部状态。 现行 Windows 还有按优先级细分的 Standby、Transition、Bad 等。另外,Active 与其说是一份单独的“Active 列表”,不如说是通过有效 PTE 正被引用的状态。保留这层区别之后,把它当成追踪应用内存行为的图来用。
图1:Working Set 正在引用的页,干净就转到 Standby,脏就转到 Modified。内容相同就能回到原处,改作他用时要么直接重用,要么为需要清零的分配而经过 Free 和 Zeroed。
图1 的 Mermaid 源码
flowchart LR
zeroed["Zeroed\n已清零"] -->|首次 Touch| active["Active / Valid\nWorking Set 正在引用"]
active -->|裁剪干净页| standby["Standby\n保留内容的重用候选"]
active -->|裁剪脏页| modified["Modified\n等待写回"]
modified -->|写回完成| standby
standby -->|软页错误回到常驻| active
standby -->|丢弃旧标识| free["Free\n未清零"]
standby -->|直接改作他用| active
free -->|供需要清零的分配使用| zeroed
这张图要抓住的是下面两点。
离开 Working Set,不等于连内容一起丢掉。 再次需要同一份内容时,可以回到还留着的那张页。
改作他用时,也不一定要依次经过 Free 和 Zeroed。 如果要作为新的按需清零私有页交给用户模式,就必须抹掉旧内容。反过来,像读入文件内容这样会覆盖整张页的用途,只要摘掉 Standby 的标识就能直接重用。
4. Active / Valid——此刻可以引用的物理页
Active/Valid 的页,通过有效的 PTE 被进程的 Working Set 或系统空间引用着。CPU 用普通的地址转换就能到达,因此这种访问本身不需要页错误。
不过,并没有什么保证说这张页会一直是 Active。内存管理器为了维持可用内存,会参考 Working Set 的大小、页最近的使用情况等,裁剪掉候选页。Microsoft 的 Working Set 文档也说明,内存管理器会为了腾出可用内存而从 Working Set 中删除页。8
4.1. 裁剪不等于释放
Working Set 裁剪改变的,主要只是此刻能否通过有效 PTE 引用的常驻状态。下面这四件事,请分开看待。
- 移出 Working Set
- 释放 Commit
- 释放虚拟地址区域
- 丢失原始数据
即使执行 EmptyWorkingSet 或工具里的“Trim Working Set”,也代替不了 VirtualFree 和堆释放。只要再次碰到同一张页,它就会通过来自 Standby 的软页错误,或来自后备存储的硬页错误回来。所以“把 Working Set 压小了”并不意味着“修好了泄漏”。
5. 干净页会去 Standby
页被移出 Working Set 后,只要内容与原文件一致,或者已经有安全的后备存储,就可以放到 Standby。典型例子如下。
- 未修改的 EXE/DLL 代码
- 未修改的内存映射文件
- 已经完成写回的私有页
- 留在文件缓存中的数据
是取回同一份内容,还是改作他用
Standby 页保留着与之前内容的对应关系。当同一个进程或别的进程需要这份内容时,只要它还没有被重用,只需一次重新挂上 PTE 的软页错误就能取回。
另一方面,如果别的分配需要物理页,就可以丢掉 Standby 的旧标识把它重用。重用目标是需要零初始化的用户模式私有页时,要准备 Zeroed;而像用文件内容覆盖整张页这样的用途,不清零也能直接重新分配。
正是这种两面性,让 Standby 既是缓存,又计入 Available。
5.1. Available 为什么包含 Standby
MEMORYSTATUSEX.ullAvailPhys 表示不写出到磁盘就能立刻重用的物理内存,等于 Standby、Free、Zeroed 之和。1
flowchart LR
accTitle: 构成 Available 的三个页列表
accDescr: 可用物理内存是 Standby、Free、Zeroed 之和,不包含 Working Set 正在引用的 Active 页
standby["Standby(保留内容的重用候选)"] --> avail["Available(可用物理内存)"]
free["Free(未清零的空闲页)"] --> avail
zeroed["Zeroed(已清零的空闲页)"] --> avail
active["Active(Working Set 正在引用)"] -.->|不包含| avail
图2:Available 是 Standby、Free、Zeroed 之和。仍然保留着内容的 Standby 也算作“可用”。
因此,任务管理器上“Free 很少,Cached/Standby 却很多,Available 也很充足”这样的显示并不矛盾。
Windows 不会让空闲 RAM 闲着,而是把最近用过的文件和代码留在 Standby。遇到同样的内容就当缓存来响应,别处需要就拿去重用。
不要一看到 Free 少就判定内存不足,请把 Available、Commit、硬页错误和处理延迟合在一起看。
6. 脏页在 Modified 里等待
应用往页里写入之后,页的内容就与原来的后备存储不再一致。把这样的脏页直接覆盖去作他用,数据就丢了。因此,被移出 Working Set 的已修改页会在 Modified 中等待写回。
写回的目的地随页的种类而变。
| 页的种类 | 典型的写回目的地 |
|---|---|
| 私有的已 Commit 页 | 页面文件 |
| 可写的映射文件 | 对应的数据文件 |
| 文件缓存中的脏数据 | 对应的数据文件 |
| 干净的 EXE/DLL 页 | 无需写回,可从原映像重新读取 |
Microsoft 的页面文件文档也说明,磁盘上已经存在的 .dll、.exe 和普通文件不必再往页面文件里重复写一份,真正会成为页面文件候选的,正是那些没有原始磁盘副本的已修改数据。3
6.1. Modified Page Writer
Modified Page Writer 是内存管理器的系统工作线程,它扫描内存管理器跟踪的、以页面文件为后备的脏页,并写出到页面文件。4 映射文件一侧有 Mapped Page Writer 等路径,与文件系统和缓存管理器协作,把内容写回对应文件。
写出并不是“RAM 不到 0 字节就什么也不做”的方式。它会按 Modified 列表、Available、页面文件的状态等,在后台预先备好将来可以重用的页。
写回完成、而且没有其他有效引用时,这张页就能带着内容进入 Standby。
flowchart TB
accTitle: 已修改页的写回路径
accDescr: 离开 Working Set 的已修改页在 Modified 列表中等待,私有页在配置了页面文件时由 Modified Page Writer 写到页面文件,映射文件的页由 Mapped Page Writer 等写回对应的数据文件,完成后进入仍保留内容的 Standby
dirty["离开 Working Set 的已修改页"] --> modified["在 Modified 列表等待写回"]
modified -->|"私有页(已配置页面文件)"| mpw["Modified Page Writer 写出到页面文件"]
modified -->|映射文件的页| mapped["Mapped Page Writer 等写回对应文件"]
mpw --> standby["写回完成后进入保留内容的 Standby"]
mapped --> standby
图3:写回目的地由页的种类决定,两条路径都在后台推进。在禁用了页面文件的系统上,私有页一侧没有写回目的地,已修改的私有页会一直留在 RAM 里。
6.2. 区分页输出与页面文件专有的 I/O
读计数器时,要把 I/O 次数和页数分开看。
| 计数器 | 统计的对象 |
|---|---|
Memory\\Page Writes/sec |
为腾出物理内存而发出的分页写入 I/O 次数 |
Memory\\Pages Output/sec |
这些写入实际送到磁盘的页数 |
Memory\\Page Reads/sec |
为解决硬页错误而发出的磁盘读取 I/O 次数 |
Memory\\Pages Input/sec |
这些读取实际进入 RAM 的页数 |
另一个要区分的点是,分页 I/O 与页面文件专有的 I/O 并不是一回事。
Page Writes/sec 和 Pages Output/sec 在写回映射文件等脏页的路径上也可能增加。输入一侧同样不区分页面文件、DLL、EXE 和内存映射文件。3
要定位 pagefile.sys 专有的 I/O,不要只凭这 4 个计数器推测,而要用 ETW/WPA 记录 File I/O 和 Disk I/O。把 FileObject 与 FileName 对应起来,确认目标文件。9
再补充一点,先写到页面文件,并不意味着马上就要从磁盘读回来。只要没有被访问,就可以把已写回的页从 RAM 拿掉,把物理内存让给使用更频繁的页。
7. Standby、Free、Zeroed 的区别
7.1. Standby
保持着与之前内容的对应关系的状态。
- 需要同一份内容时可以用软页错误取回
- 别处需要时可以丢弃旧标识后重用
- 存在按优先级细分的 Standby 列表
7.2. Free
与之前内容的有效对应关系已经失去,处于可以分配的状态。不过页内可能还残留着旧的位串。原样交给用户模式,就有泄露上一个进程信息的危险。
7.3. Zeroed
内容为零,可以安全地作为用户模式新页交出去的状态。第 1 篇的按需清零错误,就是取得可用的 Zeroed 页并挂到 PTE 的典型例子。从 Free 到 Zeroed 的准备工作,会按需求和系统状态进行。
也就是说,“Free”和“Zeroed”看上去都是空闲,但在安全方面的准备状态不同。
8. 内存压缩存储——在 RAM 内再造一个去处
Windows 10 之后的内存管理器,在有内存压力时,可能不把使用频率低的页立刻写到磁盘,而是在 RAM 内压缩它们。这些压缩页的集合就是 compression store。
8.1. 到哪里看压缩量
在 Windows 10 的早期实现中,压缩存储计入 System 进程的 Working Set;而在现行 Windows 上,调试工具的进程列表里会把它显示为专门的 Memory Compression 进程。因此,查看当前压缩量时,不能只盯着 System 进程的 Working Set。把更多应用留在物理内存里、减少磁盘 I/O 这个目的本身没有改变。1011
8.2. 压缩也有代价,而且顺序不固定
不过,下面几点要记住。
- 压缩页同样占用 RAM
- 压缩和解压要花 CPU
- 压缩了也不会消掉 Commit 的承诺
- 并不是一律“先压缩再进页面文件”的固定顺序
- 策略会随页的种类、压力和访问历史而变
任务管理器里的“使用中(已压缩)”,并不表示压缩之后物理内存就完全空出来了。压缩存储不是让页面文件变得多余的功能,而是在 RAM 与存储之间多加了一个用 CPU 换取更少 I/O 的选项。
9. 页面文件真正的作用
页面文件至少有三个作用。
flowchart LR
accTitle: 页面文件的三个作用
accDescr: 页面文件扩大 Commit Limit,成为访问频率低的已修改私有页的后备存储,并承接系统崩溃转储
pagefile["页面文件"] --> limit["扩大 Commit Limit(上限一侧的余量)"]
pagefile --> backing["已修改私有页的后备存储"]
pagefile --> dump["系统崩溃转储的承接方"]
图4:页面文件的作用不只是“慢速 RAM”。即使使用量为 0,它也在支撑上限和转储。
9.1. 扩大 Commit Limit
系统的 Commit Limit 大致由 RAM 与全部页面文件之和决定。取消页面文件后,Commit Limit 会降到略低于物理 RAM 容量的水平。Commit Total 触到上限时,新的 Commit 会失败,可能导致应用异常退出或系统运行不正常。2
这和“现在往 pagefile.sys 写了多少 GB”是两回事。页面文件同时也是支撑 Commit 这个承诺的上限一侧的余量。
9.2. 支撑已修改的私有页
用页面文件托住访问频率低的已修改私有页,就能把这些物理页从 RAM 拿掉,让给经常使用的代码和数据。2 禁用页面文件后,把这类页移出 RAM 的选择就变少了,不能简单地说“不发生换出所以更快”。
9.3. 支撑系统崩溃转储
系统崩溃时要生成 Memory.dmp,需要有能支撑所选转储方式的页面文件或专用转储文件。3 完整内存转储、内核内存转储、自动内存转储所需的容量各不相同。
在要做崩溃排查的环境里,仅仅为了省容量就删掉页面文件,很可能在最需要的时候留不下证据。收集方式请一并参考“Windows 应用的崩溃转储收集入门”。
10. 合适的大小不是一刀切
不应该只用“RAM 的 1.5 倍”这类固定公式来决定页面文件的大小。Microsoft 说明,合适的大小取决于下面两点,因系统而异,无法一般化。3
- 峰值时的 System Commit Charge
- 需要的系统崩溃转储
实际工作中按下面的顺序考虑。
10.1. 先以系统管理的大小为基准
Windows 的默认设置是系统管理的大小,它会按物理 RAM、Commit 需求、崩溃转储要求等自行增减。没有特殊限制或实测结果时,从这里开始最稳妥。
10.2. 用代表性负载测量峰值 Commit
用 PerfMon 长期采集下面这些计数器。
Memory\\Committed BytesMemory\\Commit LimitMemory\\% Committed Bytes In UseMemory\\Modified Page List BytesPaging File(*)\\% UsageMemory\\Available MBytesMemory\\Page Reads/secMemory\\Page Writes/sec
采集期间要覆盖月末处理、备份、构建、多用户同时使用等真实的峰值。
单凭页面文件使用率高,不能断定就是存储性能问题。但长期贴着上限,是容量不足的警告。要把 Commit 是否逼近上限、Modified 是否积压大量页、磁盘是否已经饱和合在一起看。3
10.3. 先定下转储要求
先决定是需要完整内存转储、内核内存转储是否足够,还是使用专用转储文件。如果要改成固定大小,就不仅要满足峰值 Commit,还要满足转储要求。
11. 用自己的眼睛确认
11.1. 用 RAMMap 查看页列表
以管理员身份启动 RAMMap,先打开 Use Counts。7 要看的项目如下。
- Active
- Standby
- Modified
- Modified no write
- Free
- Zeroed
在 Priority Summary 可以确认 Standby 按优先级分开。Processes 可以看各进程的 Working Set,File Summary 和 File Details 可以追踪 RAM 中的文件数据。
读同一个文件两次,看还留着的页
- 先读一次比较大的本地文件。
- 结束读取处理,在 RAMMap 上点 Refresh。File Summary 或 Standby 一侧可能还留着这个文件的页。
- 再读一次同一个文件。还没有被重用的页,可以不产生磁盘 I/O,或只用很少的 I/O 就取回。
结果会随内存压力、杀毒软件和文件大小而变。比起一次的数值,更要看状态转换的方向。
不要把 Empty 当作生产机的性能优化操作
另外,RAMMap 的 Empty 菜单会人为改变系统状态。不要为了给生产机提性能而清掉 Standby,只在隔离的验证环境里使用。
11.2. 用 Testlimit 把 Commit 与 Touch 分开
Testlimit 是模拟内存、句柄、进程、线程等资源不足的 Sysinternals 工具。先用手头的二进制文件执行下面的命令,确认显示出来的版本和 usage。
.\\testlimit64.exe -?
先确认版本和语法再动手
下面以 Testlimit v5.24 为准。在 v5.24 的官方语法中,-m [MB] 是按指定量分配内存,-d [MB] 是分配并 Touch,-e [seconds] 是分配间隔,-c [count] 是分配次数,-c 写在最后。手头显示的内容不同时,以那份 usage 为准。12
然后在用完即弃的虚拟机上小规模试一下。
# -m 64: 分配 64 MiB,-e 1: 间隔 1 秒,-c 8: 8 次后停止
.\\testlimit64.exe -m 64 -e 1 -c 8
# 次数和间隔相同,用 -d 对每块区域执行 Touch
.\\testlimit64.exe -d 64 -e 1 -c 8
执行期间同时记录下面这些。
- Task Manager 的“已提交 X/Y”
- RAMMap 的 Active、Modified、Standby
Memory\\Committed BytesMemory\\Commit LimitMemory\\Available MBytesMemory\\Modified Page List Bytes
耗尽的复现只在做过快照的虚拟机上进行
真要复现 Commit 耗尽时,不要在宿主机上做,而要在做过快照的虚拟机上逐级增加次数。让它自动一路分配到上限的跑法,可能造成画面卡死、进程异常退出和日志丢失。目的不是把操作系统弄到不稳定,而是观察接近 Commit Limit 时新的 Commit 会失败这件事。
12. 实际工作中要避开的四种误读
12.1. “Standby 多就是内存泄漏”
Standby 是可重用的缓存,包含在 Available 里。判断泄漏,要看进程私有 Commit 的基线和分配构成在负载结束后是否仍在持续增长。
12.2. “削减 Working Set 就能修好泄漏”
裁剪只改变常驻状态,并不释放 Commit 和虚拟分配。再次访问时会触发页错误,把页取回来。
12.3. “页面文件使用量为 0 就不需要它”
页面文件支撑的不只是当前的写入量,还有 Commit Limit 和崩溃转储。只按平时的使用量决定删除,会失去峰值时的余量和出故障时的证据。
12.4. “先内存压缩,然后必定进页面文件”
压缩不是固定的串行流水线。Windows 会按页的种类、压缩效率、CPU 负载、内存压力以及有没有后备存储来动态选择。
13. 小结
- PFN 数据库是追踪物理页的归属、引用、修改与所属页列表状态的台账。
- 离开 Working Set 的干净页会留在 Standby,需要同一份内容时可以用软页错误取回。8
- 脏页在 Modified 等待,私有页写回页面文件,映射页写回对应文件等位置。4
- Available 是 Standby、Free、Zeroed 之和,Standby 多本身并不等于内存不足。1
- 内存压缩在 RAM 内压缩页以减少 I/O,但并不消掉 Commit 和页面文件的作用。10
- 页面文件支撑 Commit Limit、已修改的私有页和系统崩溃转储。23
- 合适的大小由峰值 Commit 和转储要求决定,不能用统一的倍率来定。3
- Working Set 裁剪和清掉 Standby,都不是修复内存泄漏的手段。
接下来是第 3 篇“节对象与写时复制:DLL 与文件映射的真面目”。
我们会追踪:留在 Standby 的文件页和 DLL,为什么在多个进程看来会是同一张物理页。
相关文章
- Windows 内存底层原理(第 1 篇)——虚拟地址变成物理 RAM 的瞬间
- Windows 的“内存使用量”究竟表示什么
- Windows I/O 底层(第 4 篇)——缓存管理器与 WriteFile
- Windows 应用的崩溃转储收集入门
- Process Explorer / Handle / VMMap 实战
相关咨询领域
小村软件有限公司承接 Windows 应用程序的内存紧张、Commit 耗尽、分页、Working Set 增长以及崩溃转储采集设计等方面的调查。
参考链接
-
Microsoft Learn, MEMORYSTATUSEX structure. 关于
ullAvailPhys是不写出到磁盘就能立刻重用的物理内存,等于 Standby、Free、Zeroed 列表之和。 ↩ ↩2 ↩3 -
Microsoft Learn, Introduction to page files. 关于页面文件把访问频率低的已修改页移出 RAM、扩大 Commit Limit 以及支撑系统崩溃转储。 ↩ ↩2 ↩3 ↩4
-
Microsoft Learn, How to determine the appropriate page file size for 64-bit versions of Windows. 关于合适的大小取决于峰值 Commit 和崩溃转储要求而无法一般化,以及 Modified 列表、页面文件使用率、相关计数器和系统管理的页面文件。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8
-
Microsoft Learn, Data corruption on IO write. 关于 Modified Page Writer 是内存管理器的系统工作线程,扫描以页面文件为后备的脏页并写出。 ↩ ↩2 ↩3
-
Microsoft Learn, !pfn (WinDbg). 关于可以显示指定 PFN 条目的状态、引用、PTE 地址等信息。 ↩
-
Microsoft Learn, !memusage (WinDbg). 关于可以汇总物理内存使用情况以及 Zeroed、Free、Standby、Modified、Active 等页状态。 ↩
-
Microsoft Learn, RAMMap - Sysinternals. 关于 RAMMap 的 Use Counts、Processes、Priority Summary、Physical Pages、File Summary、File Details 会显示物理内存的用途与页列表。 ↩ ↩2
-
Microsoft Learn, Working Set. 关于内存管理器为腾出可用内存而裁剪 Working Set,以及位于 Transition 或其他进程 Working Set 中的页可以用软页错误解决。 ↩ ↩2
-
Microsoft Learn, FileIo_Name class. 关于 ETW 的 File I/O 事件带有 FileObject 和 FileName,可以把 FileObject 与 Disk I/O 事件对应起来,从而识别目标文件的 I/O。 ↩
-
Windows Insider Blog, Announcing Windows 10 Insider Preview Build 10525. 关于 Windows 10 早期的 compression store 实现把 RAM 内的压缩页集合放在 System 进程的 Working Set 中,从而减少写出到磁盘。 ↩ ↩2
-
Microsoft Learn, Find Process ID (PID) in Windows. 关于现行 Debugging Tools for Windows 的进程列表示例中,System 之下会显示 PID 不同的
Memory Compression进程。 ↩ -
Microsoft Learn, Testlimit - Sysinternals. 关于 Testlimit v5.24 中
-m为分配内存、-d为分配并 Touch、-e为分配间隔、-c为分配次数,且-c写在最后的官方语法。 ↩
相关文章
共享相同标签的最新文章。可以围绕相近的主题进一步加深理解。
Windows 的“内存使用量”究竟表示什么——正确解读 Working Set、Private Bytes、Commit 与页面文件
任务管理器的内存、Working Set、Private Bytes 与 Commit 并不是同一个值。本文讲解 Windows 虚拟内存与物理内存的关系、页面文件的作用,以及排查内存不足和内存泄漏时应当关注的指标。
Windows 内存底层原理(第 1 篇)——虚拟地址变成物理 RAM 的瞬间:页错误的全过程
串联 VirtualAlloc、VAD、页表、TLB、按需置零与硬错误,讲解虚拟地址被分配到物理 RAM 的那一瞬间。
Windows 内存底层原理(第 3 篇)——节对象与写时复制:DLL 与文件映射的真相
串联节对象、映像映射与数据映射、共享缓存以及写时复制,讲解 DLL 和共享内存共享物理页的机制。
为什么“剩余1秒”迟迟不结束?── 进度条与剩余时间的工作原理
剩余1秒持续很久、卡在99%、一直显示准备中,分别是怎么回事?从进度的分母、速度预测、最后的处理步骤和界面更新逐一解释,并提供同一任务不同进度显示的交互演示。
Windows 共享文件夹为什么时好时坏——排查 Kerberos、NTLM 与凭据问题
通过症状和日志排查 Windows 共享文件夹时而能访问、时而无法访问的问题。说明 IP 与名称的差异、仅应用失败、空密码、1219、重启及 SMB 签名的检查步骤,以及每项结果能证明什么。
相关主题
与本文相近的主题页面。以本文为起点,可以进一步了解相关服务和其他文章。
Windows 技术主题
汇整 KomuraSoft LLC 关于 Windows 开发、故障调查与既有资产活用文章的主题中心。
常见问题
汇总了咨询这一主题时常见的问题。
- 页一离开 Working Set,就会立刻写入页面文件吗?
- 不会。未修改的页会带着内容移到 Standby,成为可以立刻重用的缓存。已修改的页会移到 Modified,视需要写回页面文件或对应文件之后,再进入 Standby 等可重用状态。
- 任务管理器的 Available 包含 Standby 内存吗?
- 包含。Windows 报告的可用物理内存是 Standby、Free、Zeroed 之和。Standby 虽然还保留着旧内容,但必要时可以立刻改作他用,因此计入可用内存。
- 写入页面文件要等 RAM 完全用尽才开始吗?
- 不是。Windows 会按 Modified 列表和可用内存的状态,在后台写回访问频率低的已修改页。它不是等到彻底耗尽再一次性全部赶出去的简单机制。
- 禁用页面文件会让 Windows 变快吗?
- 一般不能这样断定。禁用会降低 Commit Limit,访问频率低的已修改页更难从 RAM 拿掉,也会影响系统崩溃转储。通常维持系统管理的大小,并用峰值 Commit 和转储要求来判断。
- 有了内存压缩,页面文件就不需要了吗?
- 并不会因此变得不需要。压缩存储是在 RAM 内压缩页以减少 I/O 的机制,但压缩后的页同样占用物理内存,也取代不了 Commit 的保证。压缩还是换出,是内存管理器的动态策略。