资讯动态

Windows虚拟内存不足怎么办?一文讲透页面文件设置与OOM排查

发布时间:2026/9/16 7:48:38 来源:尧图企业网站定制
前两天有朋友在群里发截图Windows 弹了条“您的系统虚拟内存不足”接着 IDE 直接闪退浏览器标签页全部变白连微信都掉线了。这个场景我太熟了——后台常驻着一堆应用开着 Docker、MySQL、Redis再跑一个 Java 服务或者 Android Studio物理内存很快就不够分。很多人一看这个提示第一反应就是“我 32G 内存都满了不可能吧”然后开始怀疑是不是中毒了。其实这个问题很多时候不是物理内存真的被榨干而是 Windows 的虚拟内存配置出了问题。虚拟内存这个东西平时没人注意但它就像系统的“备用仓库”物理内存不够先把暂时不用的数据挪到硬盘上数据要用再说。仓库太小或者位置不对程序就会直接报 OOMOut Of Memory。这篇我就从原理讲起把虚拟内存是什么、Windows 为什么依赖它、不同配置下到底该怎么设页面文件、真遇到 OOM 怎么排查一条线全捋清楚。无论你是刚入门的开发新手还是家里电脑经常卡死的普通用户只要照着实操大概率能把这些莫名其妙的崩溃问题压下去。1. 虚拟内存到底是什么为什么 Windows 离了它不行1.1 从物理内存到虚拟地址空间一个“预约座位”的游戏要理解虚拟内存先得搞清楚一件事你写的程序并不是直接操作物理内存的而是运行在一个“虚拟地址空间”里。每个进程都会拿到一套从 0 到 2^64-164 位系统的连续地址这个地址跟真实的 RAM 条没有一一对应关系中间隔了一层叫 MMU内存管理单元的硬件翻译官。这个过程可以用一个生活场景来类比。物理内存就像一个几十人的小自习室位置有限而进程的虚拟地址空间像是一本厚厚的预约册子每个程序都可以在上面写“我占了这个座”哪怕自习室里根本没那么多座位。真正要坐下的时候自习室才会根据预约情况安排实际座位没轮到的先在外面“待容量”里候着。这就是为什么你在 64 位 Windows 上一个进程明明只用了 500M 物理内存但它声明的“提交内存”可能高达几 GB。提交内存对应的是预约册子上的数字物理内存对应的是实际坐下的位置。Windows 有个Commit Limit提交上限它约等于物理内存加上页面文件大小。如果所有进程的提交总和超过这个上限系统才真正没有名额可约了这时候就会报“虚拟内存不足”或者 OOM。1.2 页面文件的工作方式硬盘上的“备用仓库”虚拟内存的物理载体就是位于系统盘下的pagefile.sys文件。这个文件通常默认在 C 盘默认情况下由 Windows 自动管理。它的工作机制并不复杂当物理内存压力增大系统会把一些暂时用不到的“内存页”挪到页面文件里腾出 RAM 给活跃的进程当程序需要访问这些数据时再通过页面错误Page Fault把数据从硬盘换回来。这中间最关键的一个性能点就是RAM 的速度是纳秒级SSD 的速度是微秒级机械硬盘更是直接差了几个数量级。所以页面文件的命中率、读写频率直接决定了你电脑卡不卡。一个表现就是如果页面文件太小系统频繁换页你就会看到硬盘灯狂闪鼠标飘打开任务管理器发现“内存”使用率不高但系统就是慢得像死机。1.3 OOM 的两种面目提交上限爆了 vs 物理内存真的见底很多人看到 OOM 两个字以为就是内存不够用了其实要分两层看。第一种是Commit 上限爆了。这种情况下物理内存往往还有空闲但所有进程的“虚拟提交总量”超过了物理内存加页面文件的额度。比如你装了一堆常驻软件每个进程启动时都会预声明一大块虚拟内存攒到一定程度就触顶了。32 位程序最常见的就是这种情况因为它的地址空间只有 4GB就算物理内存有 64GB单个 32 位进程能用到的上限也极其有限。第二种是物理内存真的见底。表现为任务管理器里可用内存接近 0系统开始疯狂压缩内存、清理进程此时就算现代 Windows 自带的“内存压缩”机制顶不住了最终还是会导致应用崩溃。这种情况在内存只有 8G 的机器上跑大型软件时尤其明显。而我接触到的很多情况其实是两者混合的物理内存吃紧页面文件又不会自动增长被手动改小了或者设在了一个可写空间不足的分区结果一记重锤下来系统直接判定“虚拟内存不足”。2. 虚拟内存该不该手动配置先看懂 Windows 的默认策略2.1 Windows 默认是怎么管理页面文件的Windows 默认的虚拟内存策略一句话就是自动管理所有驱动器的分页文件大小。系统会在 C 盘创建一个动态的 pagefile.sys它的大小不固定——启动时不至于太大运行中按需增长空闲时又会收缩。这套机制的设计初衷是“省心”但在实际使用中有几个很现实的问题页面文件动态伸缩会导致磁盘碎片增多机械硬盘尤其明显。增长时机往往是你内存最紧张、同时硬盘也可能很忙的时候雪上加霜。默认位置固定在系统盘而系统盘常因为装软件、缓存、临时文件而空间紧张。有些软件和驱动会要求页面文件存在才能正常工作比如某些调试器、老游戏和虚拟化软件。所以如果你电脑只是轻度办公那默认策略确实可以不动。但如果你是开发人员、游戏玩家、或者经常跑大型工程那套默认方案大概率会在你最需要的时候给你来一下。2.2 8G、16G、32G到底哪类机器必须手动设很多人会陷入一个误区内存越大虚拟内存越不重要。实际上虚拟内存并不是内存的替代品而是系统稳定性的保险。我简单分三档说8G 内存的机器属于“基本盘吃紧”。Windows 本身加浏览器就占了 70% 以上再开个大型软件物理内存很容易见底。这档位必须主动配置虚拟内存而且建议设得保守一点避免系统自动增长时疯狂占用 SSD 空间。16G 内存的机器是目前的主流配置也是大多数开发者的日常。日常办公基本够但如果你同时开 Chrome、JetBrains 全家桶、Docker 这几个内存大户仍然可能出现 OOM。16G 建议手动设置一个固定大小比如 24G给系统留足缓冲。32G 内存的机器表面看虚拟内存不太需要动但实际上我仍然建议保留系统托管或设一个固定值。原因很简单某些软件和驱动强制要求页面文件存在禁用了反而会出问题。而且 32G 物理内存并不等于不会被 OOM 命中——如果某个进程发生内存泄漏它会像一个无底洞一样把提交内存耗尽此时页面文件就成了最后一根救命稻草。2.3 结论相比“关掉”我更推荐“固定大小”网上有一种声音说“内存够大就把虚拟内存关了吧”我用实际经验告诉你别关哪怕你物理内存 128G。禁用页面文件后32 位应用和一些驱动会发生无法预料的问题。更关键的是现代 Windows 的内存管理机制比如超级预取、内核安全防护也需要页面文件的存在。你省下的那点空间换来的可能是不定期的应用崩溃和系统不稳定。所以我的结论是要么保留系统托管要么设置固定大小。对绝大多数人来说固定大小是更优解因为它避免了动态伸缩带来的碎片和增长延迟也让磁盘占用变得可预期。唯一要注意的是不要设得过于巨大白白浪费 SSD 空间。3. 实战配置五步搞定页面文件设置3.1 打开设置入口取消自动托管第一步右键“此电脑”→“属性”→“高级系统设置”→“高级”选项卡→“性能”下面的“设置”→“高级”→“虚拟内存”区域点“更改”。进去之后你会看到一个弹窗默认勾选的是“自动管理所有驱动器的分页文件大小”取消这个勾选下方的驱动器列表就会变成可编辑状态。这里要先有一个认知不要抢着选“无分页文件”这是很多人配置出错的最常见原因之一。3.2 选分区、定大小初始值和最大值的计算公式选哪个盘放页面文件我的建议是首选非系统盘、非仓库盘的 SSD 分区。原因有两点系统盘本身 I/O 压力已经很大放页面文件会加大读取竞争机械硬盘速度太慢会直接拖垮换页性能。如果你的机器有两块 SSD把页面文件放在与系统盘不同的 SSD 上效果会更好。接下来是大家最关心的问题大小怎么定。我把常见的物理内存容量和推荐页面文件值整理成一个参考表物理内存页面文件初始值页面文件最大值适用场景8G16G24G办公、浏览器多开、轻量开发16G24G32G开发、设计、虚拟机轻度使用32G32G48G重度开发、3A 游戏、多虚拟机64G 及以上32G48G工作站、视频渲染保险起见保留这个数值不是拍脑袋定的。Windows 的提交上限 物理内存 页面文件大小我的经验法则是让页面文件至少等于物理内存的 1 到 1.5 倍上限控制在 2 倍以内。有些人建议“初始值和最大值设成一样”其实就是固定大小避免系统反复伸缩。我个人也推荐固定大小初始值和最大值改成同一个数值比如 16G 内存就都设 24576MB单位注意是 MB1G1024M。3.3 设置后的确认环节无分页文件与 Dump 文件的关联这里要特别提醒一个容易踩的坑很多人在“无分页文件”的地方点了一下然后点“设置”结果系统盘的分页文件被移除了。表面上没事一旦程序崩溃Windows 就无法生成内核内存转储文件也就是 dump后续想排查内存泄漏和 OOM 根本无从下手。所以无论你怎么改请保证 C 盘至少有一个小容量的页面文件哪怕是“系统托管”也好。很多做性能分析的人喜欢把页面文件只放在 D 盘其实这样在发生内核崩溃时系统可能无法在 C 盘写入崩溃转储。我的处理方法是C 盘保留一个系统托管的页面文件D 盘SSD再放一个固定大小的页面文件双保险。3.4 保存重启并验证是否生效设置完成后点击“设置”→“确定”系统会提示“需要重启计算机才能生效”。重启之后你去 C 盘和 D 盘根目录查看能看到pagefile.sys文件并验证大小是否符合预期。也可以打开命令行用下面的命令快速查看所有页面文件的分配情况wmic pagefile list /format:list或者用 PowerShellGet-CimInstance Win32_PageFileUsage这个输出会明确显示每个页面文件的当前大小、峰值使用量和分配位置是验证配置是否生效的最直接方式。这里我提一个观察点如果你打开任务管理器看资源监视器看到“已提交”长期高于“物理内存”的总量但页面文件又有充足余量说明系统正在健康地换页。4. 当 OOM 已经发生排查与分析实录4.1 先分清是系统级还是应用级 OOM在动手排查之前要分清两种错误提示。一种是 Windows 系统托盘弹出来的“虚拟内存不足”属于系统级提交上限问题另一种是某个软件在事件日志或者控制台里直接抛出 OutOfMemoryError属于应用级问题。我遇到过一个典型案例一台 16G 内存的开发机用 IntelliJ IDEA 跑微服务项目IDE 后台编译时直接报java.lang.OutOfMemoryError: Java heap space。乍一看像是 Java 堆不够但打开资源监视器发现物理内存还有 3G 空闲问题出在整套环境里跑的 Java 服务太多Eclipse、Gradle、Tomcat、多个 Node 进程叠在一起把提交内存吃完了。这种场景下调大页面文件的优先级比盲目调 JVM 的-Xmx参数更有效。先保住系统稳定再谈应用优化。4.2 用性能监视器观察真实的内存压力Windows 自带的性能监视器是排查内存问题的好工具很多人没用过。按 WinR输入perfmon回车然后在“性能监视器”里添加计数器重点关注这几个指标Available MBytes可用物理内存。低于 200MB 时说明物理内存真见底了。Committed Bytes当前提交内存总量。Commit Limit系统当前的最大提交上限。Pages/sec每秒换页次数长期高于 200 则说明系统在疯狂换页。Page Faults/sec页面错误次数包括软和硬的页面错误波动大不一定是坏事但持续高位需要注意。我之前遇到一台服务器物理内存 64G页面文件还是 Windows 默认的自动管理结果 C 盘空间只剩 5G页面文件根本没法自动增长导致提交上限被锁死一跑批量任务就 OOM。后来把页面文件手动指到另一块剩余空间充足的 SSD 上问题立刻缓解。这就是典型的“物理内存不是瓶颈提交上限才是瓶颈”。4.3 有 dump 日志之后怎么看很多监控系统或者应用在发生 OOM 时会生成 dump 日志比如 Java 应用会在启动参数里配置-XX:HeapDumpOnOutOfMemoryError或者 Windows 蓝屏时生成.dmp文件。拿到这些 dump 文件后的分析路径我简单理一下对于 Java 的 heap dump用 MATEclipse Memory Analyzer打开第一眼先看“Histogram”看哪个对象的实例数量和占用内存最大基本就能定位到泄漏点。对于 Windows 内核 minidump用 WinDbg 打开执行!analyze -v它会自动帮你分析崩溃的原因和关联模块。如果 dump 体积太大先检查内存转储模式Windows 的“小内存转储256KB”只记录关键信息整体分析效率高很多。有 dump 日志的 OOM分析起来其实比没有的好办。真正头疼的是那种只在任务管理器里看到内存缓慢攀升、但没有任何 dump 的情况。我这里推荐一个经验型排查法先把页面文件设成固定大小然后连续监控Committed Bytes的曲线如果它持续单边增长、永不回落那么大概率是某个进程存在内存泄漏。把可疑进程逐个关掉看哪个释放出来的提交内存最多基本就能锁定目标。4.4 RAMMap 的妙用快速揪出缓存和驱动占用的“隐形内存”Sysinternals 出品的 RAMMap 是我排查 OOM 时常用的工具。它能按类型统计物理内存的分布比如是进程私有内存、文件缓存、还是内核中的分页池和非分页池占用过大。有一个真实案例某台 32G 内存的工作站平时只做文档处理和浏览但隔几天就会卡死。用 RAMMap 一看文件缓存Mapped File占了 18G而系统默认又没有及时清空导致可用内存常年被压在几百 MB。这类缓存不是坏东西但会影响你判断“内存是否够用”。遇到这种情况不要急着加内存或者调虚拟内存而是先检查是不是有杀毒软件或备份软件在后台疯狂读盘把文件缓存顶满了。5. 常被忽视的相关内存设置与兼容性细节5.1 WSL2 和 Docker Windows 里的内存分配这一节是写给开发者的。很多人把页面文件调完以后发现 Docker Desktop 里的容器还是动不动 OOM其实就是因为 Docker Desktop 这个虚拟机有单独的内存限制。默认情况下Docker Desktop 的 WSL2 后端会占用最多 50% 的总内存这会让你的 Windows 宿主机看起来“内存剩了不少但还是卡”。针对 WSL2可以在用户目录下创建.wslconfig文件内容大概是这样[wsl2] memory8GB processors4 swap4GB swapFileD:\\wsl\\swap.vhdx这里面的swap和swapFile就是 WSL2 自己的“虚拟内存”配置。把它独立出来放在非系统盘可以防止 WSL 里的编译任务把 C 盘塞满。Docker Desktop 则在设置里的 Resources 一栏调整内存和 Swap 大小。这类虚拟机层面的内存限制和 Windows 的页面文件是两套体系不能混为一谈但都会影响同一个宿主机的整体内存压力。5.2 Java、Node.js、Kafka 那些本身的堆内存设置应用自身的 OOM 有时候跟虚拟内存没关系而是应用自己的堆设置不合理。拿 Java 来说垃圾回收机制的停顿和堆外内存泄露是两大坑拿 Node.js 来说默认堆内存上限大约只有 2G64 位下按 V8 默认拿 Kafka 来说很多人只知道调KAFKA_HEAP_OPTS却忽略了 Kafka 重度依赖操作系统的页面缓存。如果你在一个机器上既跑了 Kafka 又跑了其他内存密集型服务我建议给 Kafka 的堆内存设一个合理上限比如-Xmx4g剩下的内存交给操作系统的页面缓存去处理。这样 Kafka 的性能不会差其他服务也不会被吃完内存。5.3 SSD 硬盘下的页面文件设置有讲究现在很多人的系统盘是固态但是我发现有一些人在用老旧的 SSD比如 128G 甚至 64G 的小容量盘。这种盘如果初始值设置太大会直接吃光剩余空间。我建议这种环境下页面文件初始值设成 4G 到 8G 即可配合固定大小避免系统自动增长时把盘写满。另外固态硬盘的寿命虽然不用太担心但也要避免把页面文件设在同一个盘上又同时进行高强度的下载、视频剪辑和数据库写入。有条件的话专门留一个分区或者加一块独立盘放页面文件别让所有 I/O 挤在同一个盘上。5.4 配置虚拟内存时最容易犯的三个错我把这些年看到翻车案例总结了一下集中在三个错误上。第一个是每个盘都设一个巨大的页面文件。有的人看教程说页面文件能加快速度就 C 盘设 16GD 盘设 16GE 盘设 16G结果每个盘都被塞了个 pagefile.sys磁盘空间大量浪费而系统真正用到的只有一个盘的容量其他纯属浪费。第二个是初始化时勾错驱动器和范围导致某个盘显示“无分页文件”而自己以为设置了。一定要在设置之后立刻用 3.4 节提到的命令检查一下当前生效的页面文件列表。第三个是修改完不重启。虚拟内存配置有相当一部分是需要重启才能生效的不重启的话你觉得已经调好了实际上是老配置在顶上苦撑问题依旧来回折腾半天。6. 配置后观察与一道避坑清单页面文件不是调完就一劳永逸的。我建议每次调整后用一周时间观察两个维度一是系统是否还出现内存不足的弹窗二是 C 盘或者指定盘的空间余量是否正常。如果频繁出现某进程崩溃但系统没弹窗大概率是应用自身的内存泄漏而不是虚拟内存的锅。针对观察期可能出现的情况我再给一套速查思路如果你游戏开了三小时之后变卡先切到任务管理器看可用内存和已提交内存的曲线如果“已提交”没有涨但可用内存掉到底那就是游戏或者图形驱动卡缓存暂存数据太多导致物理内存耗尽如果是“已提交”一路直线上涨那大概率是应用逻辑里的内存泄漏。这两者的处置办法是不一样的前者清理缓存和重启应用见效最快后者需要换软件版本或者修复代码。最后给一个配置虚拟内存的避坑清单都是实际经验提纯出来的不要轻易禁用页面文件宁可保留一个 4G 的小文件也别彻底移除。初始值和最大值尽量一致避免动态伸缩产生磁盘碎片和性能毛刺。页面文件优先放 SSD且不要和系统盘、下载盘挤在一起。内存越大的机器越不要以为虚拟内存没用它是提交上限的基石。所有调整完必须重启验证用命令查看实际生效的配置别只靠设置窗口上的显示。如果同时用了 WSL2 或 Docker也要检查它们各自的内存限制不能只改 Windows 一个地方。C 盘至少要保留一定的可用空间这是页面文件能撑住系统的前提。我自己的常用做法是C 盘保留系统托管的页面文件另外在 D 盘SSD设一个和物理内存一样大的固定页面文件。这种配置在几十台不同机器上试过稳定性和性能都比较均衡。如果你也经常遇到莫名其妙的 OOM先别急着换内存条花十分钟把虚拟内存看一下很多问题在马上就解决了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价