十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Windows虚拟内存设置指南:从页面文件原理到OOM排查与配置实战

Windows虚拟内存设置指南:从页面文件原理到OOM排查与配置实战 1. 先搞懂一件事虚拟内存不是内存不够时的替补而是系统内存架构的基石很多人第一次接触到 Windows 虚拟内存配置是因为电脑弹出了内存不足或者某个程序直接没了然后去百度搜内存不足怎么解决看到一堆教程说把虚拟内存调大一点。但如果你只是照着把虚拟内存从 2GB 改成 8GB十有八九问题还在——因为你不清楚这个虚拟内存到底在内存子系统里扮演什么角色也不知道 OOM 到底是操作系统报的还是某个程序自己报的。先说结论虚拟内存不是一块额外内存条也不是内存不够时临时拿来用的慢速缓存。它是一整套内存管理机制中负责地址空间抽象的那个环节。理解了这一点后面所有配置决策都会变得很简单什么时候该调大页面文件什么时候该加物理内存什么时候该去杀进程都一目了然。1.1 物理内存、虚拟地址空间与页面文件三者到底什么关系现代操作系统里每个进程看到的不是真实的物理内存条而是一段从 0 开始的、连续的虚拟地址空间。32 位进程最多能访问约 4GB 地址空间64 位进程理论上大到几乎用不完。进程里所有代码、堆、栈、动态库都映射到这段虚拟地址空间的某些区域。CPU 在访问内存时通过 MMU内存管理单元把虚拟地址翻译成物理地址真正落到内存条上。这里有一个关键点这个翻译过程不是一一对应的。一个进程可能在虚拟地址空间里预订了 20GB 的地址区域但它实际只触碰了其中 10MB。操作系统只给真正用起来的页分配物理内存帧这个机制叫按需分页Demand Paging。所以你会看到任务管理器里一个进程显示提交大小好几 GB但工作集实际占用物理内存只有几百 MB。页面文件pagefile.sys则是一个兜底仓库。物理内存是有限的、大家共享的当所有进程正在使用的页面加起来超过了物理内存容量操作系统就必须把一部分暂时用不到的页换到磁盘上好把物理内存让给正在被高频访问的页面。这个换出去的落点就是页面文件。所以虚拟内存机制实际上包含三层每个进程独立的虚拟地址空间、物理内存这个共享资源、以及页面文件这个磁盘后备存储。三者协同工作让程序可以假装自己拥有远超物理内存大小的可用空间同时保证数据不会因为物理内存被占满而丢失。1.2 OOM 到底是谁报出来的Windows 的内存不足与进程 OOM 是两码事我一直觉得把系统提示内存不足和程序提示 OutOfMemory混为一谈是绝大多数排错方向错误的开端。这两类报错虽然都叫 OOM 相关但成因和解决路径完全不同。第一类Windows 系统右下角弹提示你的系统内存不足或者弹窗说内存不足请关闭某些程序。这种是系统级的提交内存Commit Charge达到上限了。提交内存可以简单理解为所有进程向操作系统预订的虚拟内存总量它和物理内存是否真的用完没有必然关系。当一个程序申请内存时它先向操作系统预订一段虚拟地址空间如果预订总量接近物理内存 页面文件的总和系统就无法再给任何程序分配新的空间于是报内存不足。第二类某个软件自己崩溃报 OOM。比如 Java 进程抛出java.lang.OutOfMemoryError或者游戏引擎报Out of video memory。这种通常是进程自身的限制比如 JVM 堆大小设置不当、32 位进程地址空间耗尽、显卡显存不足跟 Windows 页面文件大小没有直接关系。调整虚拟内存可能缓解但不是根治手段甚至完全不相关。所以实战中你首先得问一句**这个 OOM 是谁报的**系统托盘弹的进系统配置某个程序报的先进程序日志。很多人一看到OOM就直接去调页面文件结果折腾半天发现是 Java 堆设小了这是最经典的无效操作。1.3 别被我有 32G 内存骗了提交内存才是卡脖子的指标我见过不少用户物理内存已经加到 32GB、64GB仍然会遇到系统级内存不足。他们很不解内存这么大了怎么可能不够问题恰恰出在提交内存这个指标上。在 Windows 中每个进程创建时会预订一块虚拟内存这部分不算在使用中但会占用系统级提交额度。只要某个进程预订了哪怕它一个字节都没碰系统也要确保将来需要时能拿出物理内存帧或者页面文件空间来兑现。系统能承担的最大提交量 物理内存大小 所有页面文件大小之和。这个值在任务管理器性能标签页的内存里显示为提交限制。举个例子你机器有 16GB 物理内存页面文件系统托管当前是 8GB提交限制就是 24GB。如果某个时间段你开了大量浏览器标签、一个虚拟机软件、加上几个 Electron 开发的桌面应用所有进程的提交量可能瞬间冲到 22GB 左右离上限只剩 2GB。这时你哪怕物理内存还有空闲只要再有程序申请较大内存块系统就可能弹内存不足。这个机制解释了为什么禁用页面文件是极度危险的操作。禁用了页面文件提交限制 物理内存大小物理内存再大也少了一个缓冲。64GB 内存的机器只要某个应用极端情况下提交了 65GB 虚拟内存系统照样报错。所以后面所有配置方案我都会围绕提交内存这个核心来展开而不是只盯着物理内存还有多少剩余。2. 动手设置前先查清楚这些关键数据你的系统到底虚不虚了解完原理接下来别急着去改设置。我见过太多人一上来就把页面文件设成初始 4096最大 8192设完重启该 OOM 还是 OOM因为他根本不知道自己系统的内存压力点在哪里。正确的第一步是先花五分钟把当前系统状态摸清楚。2.1 一条命令加两个面板5 分钟摸清内存与页面文件现状先看页面文件目前的配置和实际使用情况。最简单的入口按Win R输入sysdm.cpl回车后在高级选项卡下点性能区域的设置再切到高级选项卡底部就是虚拟内存区域点更改能看到每个盘符的分页文件大小。但这只是配置界面它展示的是分配大小不是实际使用量。更准确的信息要用命令行来看。在 PowerShell 里执行Get-CimInstance Win32_PageFileUsage | Select-Object Name, AllocatedBaseSize, CurrentUsage, PeakUsage输出结果里几个字段解释一下Name页面文件所在路径。AllocatedBaseSize当前分配的页面文件大小单位是 MB。CurrentUsage当前实际占用的 MB 数。PeakUsage开机以来达到过的峰值占用 MB 数。如果PeakUsage经常等于或非常接近AllocatedBaseSize说明页面文件可能不够大系统在持续扩容或者接近扩容边缘。如果CurrentUsage长期只有几百 MB说明你的内存在实际运行中并不吃紧那就不要把页面文件调得太大没必要白白占用磁盘。再执行一条命令看系统级内存状态Get-CimInstance Win32_OperatingSystem | Select-Object TotalVisibleMemorySize, FreePhysicalMemory, SizeStoredInPagingFilesTotalVisibleMemorySize是物理内存总量FreePhysicalMemory是当前空闲物理内存SizeStoredInPagingFiles是所有页面文件总和单位都是 KB。把物理内存总量加上页面文件总和你就得到了当前提交限制的理论值和任务管理器里看到的提交限制一致。2.2 资源监视器里的提交和硬错误才是定位关键任务管理器能看到总体的提交量但看不到是谁在提交。这时候打开资源监视器Win R输入resmon切到内存选项卡默认按工作集物理内存排序这个排序方式会误导你。应该点一下提交(KB)的列头按提交大小重新排序。按提交排序之后你会很清楚地看到哪些进程是虚拟内存大户。很多程序的物理内存占用并不高比如只有 200MB但提交量高达几个 GB这类进程才是把提交限制顶上去的元凶。另外特别注意硬错误/秒这个指标。资源监视器底部硬错误一栏代表程序需要访问的数据不在物理内存中必须从磁盘页面文件读取。注意一点硬错误不等于错误它是正常的内存管理行为。但如果硬错误数量持续居高不下比如一直有几万个还在涨说明物理内存在高压力下被频繁换页系统已经开始依赖磁盘来维持运行了。这时候你会感觉电脑明显变卡因为即使是 NVMe SSD访问速度也比内存慢几个数量级。这种情况就说明虚拟内存确实在起作用但物理内存已经不够用了。增加页面文件只能让系统不报错不能让它变快真正该做的是关进程或加物理内存。同理如果你发现硬错误很少但系统还是报内存不足那就是提交量接近上限的问题调大页面文件就有意义。2.3 不要被三个表面现象误导第一任务管理器里显示页面文件已用 100%不代表出问题。Windows 会尽量使用空闲物理内存做缓存页面文件的使用量波动很正常。页面文件可以动态增长所以当前占用接近当前分配大小也不是故障信号。第二我的 C 盘显示空间不足和页面文件需要空间是两个问题。页面文件默认在 C 盘但如果你把 C 盘塞满到只剩几百 MBWindows 在扩容页面文件时会失败甚至可能导致系统运行异常。这个情况下要先清理磁盘而不是去改虚拟内存。第三有些人喜欢在性能选项里把虚拟内存改成无分页文件理由是我有这么多内存不需要磁盘来拖慢速度。这个操作我建议绝对不要做。前面已经解释过提交限制会缩水到只剩物理内存很多默认会预订大量虚拟内存的应用浏览器、开发工具、Adobe 系列会直接崩溃或行为异常。而且 Windows 在发生蓝屏时需要用页面文件写内核内存转储没有页面文件蓝屏诊断信息都留不下来。3. 配置方案怎么选16G、32G、64G 分别怎么设现在进入正题到底该把虚拟内存设成多大。这个问题网上答案千奇百怪有说设成物理内存 1.5 倍的有说 2 倍的还有说初始化大小 4096最大值 8192一刀切的。这些说法不能说全错但基本都不讲前提离开你的实际内存大小和使用场景谈参数全是耍流氓。3.1 不同容量下的推荐参数表先给一张按物理内存容量划分的参考表。前提是普通台式机/笔记本Windows 10 或 Windows 11系统装在 SSD 上日常覆盖办公、网页、影音、轻度到中度开发、游戏等常见场景。物理内存常见场景推荐方案如果一定要自定义初始/最大MB8GB轻办公、网页浏览、轻度文档系统托管4096 / 819216GB日常使用、中轻度游戏、浏览器多开、学习开发系统托管2048 / 819232GB重度开发、虚拟机、视频剪辑、3A 游戏系统托管1024 / 409664GB 及以上工作站、大型虚拟机集群、专业渲染系统托管1024 / 2048注意我推荐的首选方案几乎都是系统托管。这个后面专门说。上面自定义列只适用于特殊需求比如你有多块硬盘想指定页面文件落盘位置或者公司安全策略要求固定大小。为什么大内存机器反而不需要很大的页面文件因为内存够大实际换页需求极少。但保留一个小页面文件可以确保提交限制高于物理内存给系统留出余量。很多专业软件比如数据库、渲染器在启动时会检查可提交内存太小可能直接拒绝启动。3.2 为什么我更推荐系统托管而不是自定义大小在多数 Windows 10/11 版本中系统默认开启自动管理所有驱动器的分页文件大小。这个选项开启时Windows 会综合物理内存大小、历史使用峰值、磁盘剩余空间等因素动态调整页面文件大小。很多老教程不喜欢系统托管理由是页面文件会忽大忽小导致碎片化。这个说法在机械硬盘时代有一定道理当时动态扩容会在大文件旁边产生碎片影响读取速度。但现在系统盘基本都是 SSD页面文件的随机读写性能远好于机械硬盘碎片化对性能的影响可以忽略。而且 Windows 对页面文件的碎片管理也做了大量改进没必要再手动固定成一个大文件来防碎片。自定义大小最怕遇到什么问题我遇到的实际案例是初始大小设了 1024MB最大值设了 8192MB结果某个程序提交内存突然暴涨页面文件从 1GB 一路扩容到 7GB。扩容期间系统响应明显变慢因为页面文件在洞洞板一样的磁盘空间里找连续区域写数据。如果初始大小直接设成 8GB就不会有这个问题但又浪费了磁盘空间。系统托管则会在后台用更聪明的策略处理不需要用户操心。还有一点系统托管下Windows 会把页面文件放在系统盘上系统发生蓝屏时能正常创建崩溃转储文件。如果你手动把页面文件搬到其他盘同时又在系统盘设了无分页文件蓝屏时将无法生成完整的 minidump排错会非常被动。3.3 SSD 场景下的页面文件设置寿命与性能如何平衡关于 SSD 和虚拟内存最常见的担心是页面文件频繁读写会损耗 SSD 寿命。这个担心理论上成立但实际影响远比想象中小。现代 SSD 的寿命用 TBW总写入字节数来衡量普通的 512GB SSD 通常有 300TBW 以上寿命。页面文件每秒读写量即使峰值很高日常均值也就几十 MB一天下来很难超过几百 GB。按这个速度页面文件的写入摊到整块 SSD 上对寿命的影响微乎其微远不如下载大文件、视频剪辑、数据库写入来得明显。所以我不建议为了保护 SSD而禁用页面文件或者把它迁到机械硬盘。把页面文件放在机械硬盘上内存压力一大系统会在慢速磁盘上疯狂换页整机卡到怀疑人生这种体验损失远大于省下的那点 SSD 寿命。如果你有两块 SSD可以考虑把页面文件放到第二块上。这个操作的意义不是保护系统盘而是让页面文件的读写与系统盘上的其他 I/O 分离。比如你在编译大型项目或运行数据库时系统盘本来就有大量读写页面文件又参与进来容易出现 I/O 排队。放到第二块 NVMe SSD 上能分摊一些压力但提升幅度有限不必强求。如果你只有一块 SSD乖乖放 C 盘就行别折腾。4. Windows 11/10 虚拟内存配置实操从入口到验证配置虚拟内存本身不难但有个细节很反直觉你点了确定不代表设置生效改过之后必须重启而且设置界面里的设置按钮特别容易被忽略。4.1 完整设置步骤注意每一步的坑第一步打开虚拟内存配置窗口。最快的方式是Win R输入sysdm.cpl在高级选项卡下点性能的设置再切到高级选项卡点击虚拟内存区域的更改按钮。第二步取消勾选最上方的自动管理所有驱动器的分页文件大小。不取消这一步下面所有选项都是灰色的改了也没用。第三步选择你要放置页面文件的盘符。默认是 C 盘。如果你只是想调整大小选中 C:再选自定义大小填入初始大小和最大值然后点一下右侧的设置按钮。这一步非常关键很多人填完数字直接点确定回头再看发现根本没改就是因为漏掉了设置按钮。对话框下方当前显示的还是旧值。第四步如果你在某个盘上已经设置了页面文件但现在不想要了选中该盘符选无分页文件点设置。Windows 会建议你在其他盘保留至少一个页面文件否则蓝屏时没法写转储除非你确实了解后果否则建议在系统盘保留一个小页面文件。第五步一路点确定系统会提示需要重新启动计算机才能生效重启后配置生效。4.2 自定义大小之后怎么验证真的生效了重启完成后先别急着开一堆软件先验证一下设置是否写入。最简单的验证方式再次打开虚拟内存设置界面看对应盘符下显示的当前分配是否和你的设置一致。但有时候系统托管的旧配置没清理干净界面显示的值可能有缓存所以更推荐用命令验证。Get-CimInstance Win32_PageFileUsage | Select-Object Name, AllocatedBaseSize这个命令的输出会直接告诉你每个页面文件的实际分配大小。如果你设置了 C 盘 4096MB这里应该显示 4096。同时看一眼提交限制是否变化。打开任务管理器的性能标签切到内存右下角有已提交的更改/限制两项。提交限制应该约等于物理内存 你设置的所有页面文件大小之和。如果你把页面文件从系统托管改成了固定 8GB提交限制会相应变化这个变化可以帮你确认 Windows 确实按新配置在运行。4.3 配置中常见的几个你以为成功了其实没有的坑填了参数但没点设置按钮点确定直接关闭。这个问题出现的频率高得离谱我给人远程排查时十次有七次是这个原因。选择了无分页文件后C 盘依然显示有 pagefile.sys 文件。这个文件可能属于旧的崩溃转储配置也可能是休眠文件hiberfil.sys让你看混了。确认页面文件状态以Win32_PageFileUsage命令为准别用文件资源管理器猜。设置了自定义大小但系统盘空间不够。页面文件在初始化时要一次性占用初始大小对应的磁盘空间比如你设置 8192MB剩余空间低于 8GB 就会失败。建议至少保留初始大小 2 倍以上的空闲空间。某些优化工具会把虚拟内存自动改成固定值同时禁用自动管理。如果你以前用过系统清理、优化类软件第一次设置前最好先检查一下当前配置不要默认现在是系统默认状态。5. OOM 实战排查谁在吃掉你的内存配置调整完之后如果系统还是报内存不足或者程序还是 OOM那就不能继续停留在调虚拟内存这个层面了。这时候要像排查故障一样一步步定位内存到底被谁吃掉了。5.1 系统提示内存不足先从提交峰值找突破口如果你的系统是偶尔弹内存不足重启就好那大概率是某个瞬间提交内存冲到了上限。这时候普通任务管理器已经不够用了因为等你打开任务管理器峰值可能已经回落。可以用性能监视器记录一段时间的提交量变化。Win R输入perfmon打开性能监视器添加计数器时选择Memory对象下的Committed Bytes和Commit Limit两个计数器。Committed Bytes 是当前提交数Commit Limit 是提交上限。把这两个值叠加在一张图上观察如果在崩溃发生前 Committed Bytes 逼近 Commit Limit说明就是系统级提交瓶颈。这时调大页面文件最大值是有效的。如果 Committed Bytes 一直离 Commit Limit 很远但系统还是提示内存不足问题就不在虚拟内存了。要么是某个进程内部报错被误读成系统提示要么是驱动层申请连续物理内存失败这类情况就要去看事件查看器里的应用程序日志和系统日志。5.2 高频 OOM 场景逐个击破我在实际维护机器时发现下面几个场景的 OOM 出现频率最高而且每个的解决思路差异很大。浏览器多开。Chrome/Edge 每个标签页都是独立进程每个进程都会预留不少虚拟内存。开几十个标签页提交内存轻松冲到 10GB 以上。加上部分网站后台脚本一直跑JavaScript 堆不断膨胀看视频时还要额外申请显存缓冲。这种情况下加大页面文件可以避免系统报错但浏览器本身可能因为单进程内存过大而卡顿。更有效的做法是换掉那些自动休眠标签页的浏览器插件或者定期清理标签页。WSL2 和 Docker Desktop。这两个是开发者的内存黑洞。WSL2 默认会使用物理内存的 50% 或更多即便里面只跑了一个很小的服务。Docker Desktop 基于 WSL2默认配置同样激进。如果你 32GB 内存跑着 Docker 桌面版、VS Code、Node 服务再开两三个浏览器窗口提交内存很容易压到极限。这时要在用户目录下创建.wslconfig文件限制 WSL2 的内存和交换空间[wsl2] memory8GB swap4GB保存后执行wsl --shutdown让配置生效。改完之后 WSL2 只会使用最多 8GB 物理内存剩余的留给宿主机。这个配置是解决Docker 一开系统就内存不足最直接有效的手段。Java 进程特别是 Elasticsearch、Kafka。这类进程的 OOM 大多和 JVM 堆配置有关。Elasticsearch 的堆大小在config/jvm.options里默认-Xms1g -Xmx1g数据上来之后很容易堆内存溢出。Kafka 的 OOM 很多时候是堆外内存和页缓存设置不合理。解决办法不是说加大 Windows 页面文件而是审视 JVM 的和系统内存的分配比例。我给 Elasticsearch 调优时总的原则是给 ES 的堆不要超过物理内存的一半同时确保系统剩余内存足够运行操作系统和其他基础服务。如果机器内存本身不够就加大页面文件也只是推迟崩溃时间治标不治本。游戏和图形应用。有些游戏在加载新地图时会出现瞬时提交内存飙升如果你页面文件最大值设小了游戏就会直接闪退。这时候把页面文件最大值放宽到物理内存的 1.5 到 2 倍比较稳妥。但这只能解决系统提交上限层面的问题如果游戏本身有显存泄漏还是要更新驱动或者等游戏补丁。5.3 内存泄漏与驱动占用RAMMap 和池内存的定位思路有一种 OOM 最让人头疼内存占用慢慢爬升几天后系统越来越卡最后弹窗报错重启后一切恢复正常。这是典型的内存泄漏。Windows 下优先用微软官方的 RAMMap 工具定位它可以按页类型、按进程把物理内存的每一页都列出来。打开 RAMMap 后看Process标签页按 Private 列排序。Private 列表示进程独占的物理内存如果某个进程的 Private 值持续增长不回落基本可以锁定就是它在泄漏。常见的泄漏源包括第三方杀毒软件、部分厂商的显卡驱动托盘程序、某些网卡驱动、笔记本电源管理服务。修复方式是更新驱动、更换软件。手动清空待机列表Standby List只能临时让可用内存数字变好看解决不了泄漏根源因为待机列表本来就会被系统自动回收。驱动层面的内存占用还有一个隐蔽来源非分页池Nonpaged Pool。如果你注意到系统内存里 Paged Pool 和 Nonpaged Pool 数值异常高且没有对应的高占用进程那很可能是某个内核态驱动泄漏。可以用poolmon工具配合主题标识来定位具体驱动但这个操作难度较高普通用户建议直接通过 Windows 事件查看器找到最近更新或报错的驱动然后回滚或更新。5.4 我已经按推荐设置了还是报错按这个顺序排查如果你严格按照推荐设置调整了页面文件还报内存错误别急着重装系统按下面这个顺序走一遍。第一步看提交限制和已提交的关系。如果已提交已经顶到限制说明当前的页面文件最大值仍然不够。先临时把最大值再调大一倍看能否缓解。如果已提交不高但物理内存长期 100%那说明是物理内存不够而不是虚拟内存不够加页面文件没有意义。第二步看 C 盘剩余空间。页面文件扩容失败经常被误读为内存不足因为系统没有直观提示页面文件无法扩容。C 盘剩余空间至少保持 10GB 以上。第三步查事件查看器。在Windows 日志 - 系统里找最近红色错误级别的日志关键词包括内存资源不足提交等。同时在应用程序日志里找对应程序报错记录。这一步能帮助区分系统级 OOM 和程序级 OOM很多问题到这里就清晰了。第四步检查是否同时运行了多个内存大户。比如你开了虚拟机又开着 Docker还有几十个浏览器标签那无论虚拟内存设多大都很难完全避免卡顿。虚拟内存不是无限量的物理内存的瓶颈只能靠压缩并发或者加内存条来治。6. 收尾经验我踩过的坑和最终养成的配置习惯关于 Windows 虚拟内存配置我自己的态度经历了一个变化过程。刚接触电脑时觉得虚拟内存是个好东西越大越快于是直接设成 16GB 固定值。后来觉得系统托管才是王道干脆全部交给 Windows。中间还犯过一次傻为了追求极致性能把所有页面文件都禁用了结果 PS 和浏览器轮流崩溃折腾一晚上才反应过来。现在我的配置习惯很简单也推荐你参考系统盘保持系统托管不做特殊设置如果机器内存小于等于 16GB我会在空间充裕的第二块 SSD 上再设一个最小 2048MB、最大 4096MB 的页面文件作为系统盘压力过大时的兜底。如果只有一块 SSD那什么都不动默认就能跑得很好。我还养成一个习惯每次给机器做性能排查时顺手记录一下PeakUsage这个数值。页面文件的峰值使用量是个特别有用的指标它间接告诉你系统在历史运行中是否出现过物理内存压力。如果峰值长期接近分配上限说明你的使用模式对内存需求很大这种情况下我优先考虑加物理内存条而不是无限调大页面文件——因为磁盘再快也快不过内存页面文件只能解决能不能跑的问题解决不了跑得快不快的问题。最后分享一个小技巧调完虚拟内存后不要马上开大型软件重启后先让它空载跑十几分钟让 Windows 完成页面文件的预分配和系统服务预热。然后再打开平时常用的软件观察任务管理器里提交内存的变化。如果提交值稳定在限制的一半以下这次配置就是成功的。如果还是经常逼近上限说明该精简化启动项、关掉多余服务或者认真考虑升级物理内存了。
返回列表