内存压缩与页面文件:Windows 到底在做什么
备用内存、内存压缩与页面文件如何配合,该看哪些计数器,以及为什么「空闲内存」是错的观察指标。
测试环境Pro (26H2) / Server · 版本号 26300.9457 / 26100.33650 · x64
E1- 版本号
- 26300.9457 / 26100.33650
- 版本
- Pro (26H2) / Server
- 架构
- x64
- 支持
- 文档(E1)
- 证据
- E1官方文档
- 核验日期
- 2026-10-29
- 页面类型
- 概念
物理内存紧张时,Windows 按这个顺序做三件事:
- 裁剪缓存——先放弃 standby(缓存)页,这是免费的。
- 压缩仍然需要的页——内存压缩把它们压缩后继续留在内存里。
- 写入页面文件——压不动的页才走磁盘。
“空闲内存”只统计什么都没干的页。真正该看的是可用内存,它包含 standby 和 free。
Get-Counter '\Memory\Available MBytes','\Memory\Committed Bytes','\Memory\Commit Limit','\Memory\Pages/sec' -MaxSamples 3Get-Counter '\Memory\Standby Cache Normal Priority Bytes' -MaxSamples 2Get-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 可用且持续换页不是。
内存压缩开着吗
Section titled “内存压缩开着吗”Get-MMAgent | Select-Object MemoryCompression,PageCombiningMemoryCompression : True 表示压缩存储处于活动状态,当前客户端版本默认开启。页合并(PageCombining)去重相同页面——对虚拟机和大量相似进程有用。
Windows Server 上内存压缩是刻意保守的:服务器通常内存充足、负载可预测,而压缩要花 CPU。不要因为“桌面有”就打开它。
页面文件该多大,别信传说
Section titled “页面文件该多大,别信传说”“1.5 倍内存”这条规则早于 SSD 和 64GB 桌面。真正重要的是:
- 能不能不要页面文件? 不行——部分 Windows 功能和崩溃转储需要它。“为了性能关闭页面文件”是会弄坏东西的迷思。
- 系统托管是合理默认:需要时增长,平时很小。
- 固定大小适合可预测的服务器:下限要够放下工作集,需要转储就再加上转储大小。
- 放到另一块盘只在那块盘确实更快或不那么忙时才有意义。
Get-CimInstance Win32_PageFileSetting | Select-Object Name,InitialSize,MaximumSizeGet-CimInstance Win32_PageFileUsage | Select-Object Name,AllocatedBaseSize,CurrentUsage,PeakUsagePeakUsage 接近 AllocatedBaseSize 说明文件大小完全由需求驱动——要么给它设下限,要么加内存。
判断“要不要加内存”
Section titled “判断“要不要加内存””用真实负载,不要看待机数字:
- 正常开一天的应用。
- 观察
Available MBytes与Committed Bytes / Commit Limit。 - 已提交内存长期高于上限的 ~90%,且
Pages/sec持续偏高——你是真的不够。 - 已提交量正常但某个进程工作集一直涨——那是泄漏,加内存只能拖延。
Get-Process | Sort-Object WorkingSet64 -Descending | Select-Object -First 10 Name,@{n='WS_MB';e={[math]::Round($_.WorkingSet64/1MB)}}E1。计数器与代理行为有微软文档依据。本文不发布实验室的压缩比,因为 2 vCPU 虚拟机的比例无法迁移到真实桌面。