# 内存压缩与页面文件：Windows 到底在做什么

> 备用内存、内存压缩与页面文件如何配合，该看哪些计数器，以及为什么「空闲内存」是错的观察指标。

**测试环境**

- 版本号: 26300.9457 / 26100.33650
- 版本: Pro (26H2) / Server
- 架构: x64
- 证据: E1
- 核验日期: 2026-10-29

## 一句话结论

物理内存紧张时，Windows 按这个顺序做三件事：

1. **裁剪缓存**——先放弃 standby（缓存）页，这是免费的。
2. **压缩**仍然需要的页——内存压缩把它们压缩后继续留在内存里。
3. **写入**页面文件——压不动的页才走磁盘。

"空闲内存"只统计什么都没干的页。真正该看的是**可用内存**，它包含 standby 和 free。

## 看对计数器

```powershell
Get-Counter '\Memory\Available MBytes','\Memory\Committed Bytes','\Memory\Commit Limit','\Memory\Pages/sec' -MaxSamples 3
Get-Counter '\Memory\Standby Cache Normal Priority Bytes' -MaxSamples 2
Get-CimInstance Win32_OperatingSystem |
  Select-Object @{n='TotalGB';e={[math]::Round($_.TotalVisibleMemorySize/1MB,1)}},
                @{n='FreeGB';e={[math]::Round($_.FreePhysicalMemory/1MB,1)}}
```

| 计数器 | 含义 | 危险信号 |
|---|---|---|
| `Available MBytes` | 空闲 + standby | 开着常用应用却长期接近 0 |
| `Committed Bytes` vs `Commit Limit` | 需求 vs 系统能承载的上限 | 持续高于 ~90% |
| `Pages/sec` | 硬缺页在磁盘与内存间搬页 | SSD 已经很忙还持续偏高 |
| `Standby Cache … Bytes` | 文件缓存 | 负载下掉到接近 0 |

2GB 空闲 + 6GB standby 是健康的。500MB 可用且持续换页不是。

## 内存压缩开着吗

```powershell
Get-MMAgent | Select-Object MemoryCompression,PageCombining
```

`MemoryCompression : True` 表示压缩存储处于活动状态，当前客户端版本默认开启。页合并（`PageCombining`）去重相同页面——对虚拟机和大量相似进程有用。

Windows Server 上内存压缩是刻意保守的：服务器通常内存充足、负载可预测，而压缩要花 CPU。不要因为"桌面有"就打开它。

## 页面文件该多大，别信传说

"1.5 倍内存"这条规则早于 SSD 和 64GB 桌面。真正重要的是：

- **能不能不要页面文件？** 不行——部分 Windows 功能和崩溃转储需要它。"为了性能关闭页面文件"是会弄坏东西的迷思。
- **系统托管**是合理默认：需要时增长，平时很小。
- **固定大小**适合可预测的服务器：下限要够放下工作集，需要转储就再加上转储大小。
- **放到另一块盘**只在那块盘确实更快或不那么忙时才有意义。

```powershell
Get-CimInstance Win32_PageFileSetting | Select-Object Name,InitialSize,MaximumSize
Get-CimInstance Win32_PageFileUsage | Select-Object Name,AllocatedBaseSize,CurrentUsage,PeakUsage
```

`PeakUsage` 接近 `AllocatedBaseSize` 说明文件大小完全由需求驱动——要么给它设下限，要么加内存。

> **警告: 不要「清理」备用内存**
>
> 所谓"释放内存"工具会清掉 Windows 刻意保留的文件缓存。下一次启动更慢，什么也没换来。别的进程需要时，Windows 自己会裁剪。

## 判断"要不要加内存"

用真实负载，不要看待机数字：

1. 正常开一天的应用。
2. 观察 `Available MBytes` 与 `Committed Bytes / Commit Limit`。
3. 已提交内存长期高于上限的 ~90%，且 `Pages/sec` 持续偏高——你是真的不够。
4. 已提交量正常但某个进程工作集一直涨——那是泄漏，加内存只能拖延。

```powershell
Get-Process | Sort-Object WorkingSet64 -Descending |
  Select-Object -First 10 Name,@{n='WS_MB';e={[math]::Round($_.WorkingSet64/1MB)}}
```

## 相关

- [内存容量怎么选](https://winbook.fyi/zh/hardware/ram/)
- [通道与核显共享内存](https://winbook.fyi/zh/hardware/ram/channels-uma/)
- [内存故障排查](https://winbook.fyi/zh/hardware/ram/diagnostics/)

## 实验室边界

E1。计数器与代理行为有微软文档依据。本文不发布实验室的压缩比，因为 2 vCPU 虚拟机的比例无法迁移到真实桌面。

## 来源

- [Microsoft Learn — 内存管理](https://learn.microsoft.com/zh-cn/windows/win32/memory/memory-management)
- [Microsoft Learn — Get-MMAgent](https://learn.microsoft.com/zh-cn/powershell/module/mmagent/get-mmagent)
- [Microsoft Learn — Win32_PageFileSetting](https://learn.microsoft.com/zh-cn/windows/win32/cimwin32prov/win32-pagefilesetting)
- [Microsoft Learn — Get-Counter](https://learn.microsoft.com/zh-cn/powershell/module/microsoft.powershell.diagnostics/get-counter)

---

来源页面: https://winbook.fyi/zh/hardware/ram/compression-pagefile/
