FEATURED · 精选文章

Windows虚拟内存与OOM排查:页面文件配置详解

发布时间 / 2026/9/16 20:36:43
来源 / 创域科博编辑部
栏目 / 资讯中心
Windows虚拟内存与OOM排查:页面文件配置详解 1. 先把话说清楚虚拟内存到底是什么为什么 OOM 不全是内存条的锅很多朋友一看到“内存不足”的弹窗第一反应就是“该加内存条了”。这个思路不能说错但在很多场景下加内存条并不是唯一解甚至不是最优解。Windows 虚拟内存这个机制从 Windows 95 时代一路走到 Windows 11它的作用和配置逻辑一直被大量用户误解。虚拟内存的本质是操作系统在物理内存RAM不够用的时候把一部分硬盘空间当作内存来用的“缓冲地带”。它在 Windows 里以两种形式出现一是页面文件pagefile.sys二是系统托管的“提交内存限制”。很多人只知道前者不知道后者导致遇到问题的时候只会去调页面文件大小治标不治本。OOMOut of Memory问题是虚拟内存话题里绕不开的痛点。你在跑 Docker Desktop、Elasticsearch、Kafka、Node.js 构建任务或者打开大量 Chrome 标签页时系统弹“你的计算机内存不足”往往不是物理内存真的被吃满而是提交内存commit memory达到了上限。提交内存 物理内存 页面文件大小这个公式几乎是整个虚拟内存配置的灵魂理解了它你就明白了为什么有人 32GB 内存还会 OOM为什么有人 8GB 内存跑大型软件也不卡。这篇文章会从 Windows 虚拟内存的底层机制讲起再给出一套可以直接抄作业的配置方案最后专门针对 Docker、Elasticsearch、GPU 虚拟内存这类高频 OOM 场景做逐一拆解。无论你是普通用户、开发者还是运维都能从中找到自己需要的部分。我会尽量把每一步的“为什么这么做”也讲清楚而不只是丢给你一串数字。2. 页面文件、提交限制与崩溃转储三个概念串起整个虚拟内存体系2.1 页面文件不是“虚拟内存”的全部先纠正一个最常见的误区很多人把虚拟内存等同于页面文件pagefile.sys然后陷入“设多大”的纠结里。实际上Windows 的虚拟内存是一个抽象的地址空间体系页面文件只是它的物理支撑之一。Windows 为每个 64 位进程提供了理论上 128TB 的虚拟地址空间这远远超出物理内存的容量。进程里 malloc 出来的内存、.NET 运行时申请的内存、JVM 堆一开始都只是“虚拟提交”reserved/committed只有在真正访问到对应页面时才会映射到物理内存或者页面文件。这就意味着一个进程可以申请比物理内存大得多的内存只要系统的总提交量没有超过“物理内存 页面文件”的限额。拿游戏加载场景举例你玩一个大型 3A 游戏引擎可能在启动阶段就一口气提交了 20GB 的虚拟内存但实际只使用了 10GB。这 20GB 的提交量会记在系统的“提交限制”里即使物理内存只有 16GB只要页面文件够大系统就不会报“内存不足”。反之如果页面文件被禁用或者设得很小提交限制就逼近物理内存哪怕你物理内存明明还有空闲系统也可能因为“提交量超限”而拒绝分配内存这就是那种最让人抓狂的“明明内存没用完却报内存不足”的情况。2.2 提交限制公式你真正需要记住的一个等式Windows 的任务管理器“性能”选项卡里能看到“已提交”和“提交限制”两个数字。它们的关系是提交限制 物理内存大小 所有页面文件大小注意这里说的是“所有”因为 Windows 支持多盘多页面文件。你的物理内存是 16GBC 盘页面文件设了 8GBD 盘页面文件设了 4GB那么提交限制就是大约 28GB还有少量系统保留。当“已提交”数字逼近“提交限制”时系统就会进入内存压力状态轻则提示内存不足重则触发 OOM 崩溃。这个公式的价值在于它决定了你能同时开多少程序、跑多少内存密集型任务而不只是决定某个程序卡不卡。很多人在 16GB 内存的机器上跑 Docker Desktop IDE 浏览器遇到 OOM 后第一反应是加内存条但如果你仔细看任务管理器会发现“已提交”远没到 16GB倒是页面文件被系统从“系统托管”临时涨上来了这时候调整页面文件的初始大小和最大大小就能避免 OOM。2.3 崩溃转储与虚拟内存的隐藏关联还有一个容易被忽略的关联点Windows 蓝屏时生成的 dump 文件大小受虚拟内存配置影响。如果你选择了“自动内存转储”或“完全内存转储”系统需要把物理内存的内容写入页面文件然后在下次启动时抽取为 MEMORY.DMP。如果页面文件太小转储可能失败导致蓝屏后没有任何崩溃分析素材运维排障直接抓瞎。这也是为什么很多 Windows 服务器上页面文件的最佳实践不是“设为 0”也不是“系统托管”而是有一个专门的建议值后面我会详细展开。3. 虚拟内存到底该设多大不同内存容量下的配置建议与计算逻辑3.1 “系统托管”的适用边界关于虚拟内存大小网上最主流的说法是“让系统自动管理”。这句话对也不对。对于普通办公电脑系统托管确实省心Windows 会根据负载动态调整页面文件大小。但问题在于动态调整是滞后的——当某个进程突然申请大块内存时系统需要先扩展页面文件再完成映射这个过程中会出现明显的卡顿极端情况下会直接判定内存分配失败。如果你只是在追剧、写文档、浏览网页系统托管完全够用。但如果你是开发者电脑上常年挂着 Docker、数据库、IDE或者你是设计师要处理大尺寸的 PSD、视频工程就应该从“系统托管”切换到“自定义大小”一次性把页面文件的空间预留好避免运行中途的动态扩展。3.2 不同内存容量下的推荐配置我给出一套经过大量实测的配置参考分为普通办公、开发/设计、重度虚拟机与服务器三类场景物理内存场景初始大小最大大小所在盘符8GB办公/网页4096MB8192MBC盘或非系统盘8GB开发/轻度 Docker8192MB12288MBD盘或E盘16GB办公/网页4096MB8192MBC盘16GB开发/虚拟机8192MB16384MB非系统盘32GB开发/重度多任务8192MB16384MB非系统盘32GB服务器/数据库16384MB32768MB独立数据盘64GB及以上所有场景4096MB8192MBC盘或非系统盘先解释一下为什么内存越大页面文件反而可以越小。物理内存足够大时系统绝大多数时间都在用物理内存页面文件只是个兜底。把页面文件设得很小甚至有人设为固定 800MB可以避免 Windows 在后台频繁写入 pagefile.sys减少 SSD 的写入损耗也让“已提交”的计量更精确。但注意我不建议完全禁用页面文件。有些软件比如 Adobe 全家桶的某些版本、部分老牌数据库会主动查询页面文件的存在禁用了反而会报错或性能异常。3.3 页面文件放在哪个盘有讲究很多人直接把页面文件放在 C 盘图省事。如果你的系统盘是 SSD应用和数据盘是机械硬盘那么页面文件放 C 盘反而是合理选择因为 SSD 的随机读写能力远强于机械盘虚拟内存的换页性能更好。但有一种情况建议把页面文件挪到非系统盘C 盘剩余空间告急。页面文件默认大小可能达到内存的 1.5 倍以上在 32GB 内存的机器上就是 48GB 的空间占用对 256GB 的系统盘来说压力不小。这时候把页面文件迁移到 D 盘或数据盘能有效缓解 C 盘紧张。还有一个操作细节Windows 支持在多个盘符下同时设置页面文件。你可以保留 C 盘 2GB 的初始文件用于崩溃转储然后把大头放到 D 盘。这样既保证了蓝屏 dump 的能力又分散了 IO 压力。3.4 “虚拟内存设置错误”的典型症状与修复Win10/Win11 上常见的虚拟内存配置错误通常表现为开机后提示“Windows 在您的计算机上检测到页面文件配置问题”或者“系统在未创建页面文件的情况下启动了”。这类问题一般出现在你修改了页面文件配置但没重启或者注册表里的 PagingFiles 值损坏之后。修复方式很直接进入“高级系统设置 → 性能设置 → 高级 → 虚拟内存更改”先勾选“自动管理所有驱动器的分页文件大小”应用并重启让系统重新生成一套默认配置然后再进入自定义配置手动指定大小。如果这样还不行就需要检查注册表项HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management中的PagingFiles正常情况下它的值应该是类似C:\pagefile.sys 4096 8192的格式格式异常会导致系统无法识别页面文件。4. 一步步实操Win10/Win11 虚拟内存配置全流程4.1 打开虚拟内存设置的正确路径不同版本的 Windows 打开设置面板的路径略有差异但核心入口是一致的。Win10 和 Win11 都可以通过以下路径进入右键“此电脑” → 属性 → 高级系统设置在“高级”选项卡的“性能”区域点击“设置”切换到“高级”选项卡在“虚拟内存”区域点击“更改”Win11 还有一个更直接的方式设置 → 系统 → 系统信息 → 高级系统设置。实际上它最终指向的还是同一个控制面板窗口只是入口更现代。进入虚拟内存设置界面后你会看到“自动管理所有驱动器的分页文件大小”默认是勾选的。要手动配置第一件事就是取消这个勾选。4.2 自定义配置的完整步骤取消勾选后按以下步骤操作选中要放置页面文件的盘符比如 D 盘选择“自定义大小”在“初始大小”和“最大大小”里填入你按上表计算出的值点击“设置”按钮确认列表里出现了你配置的条目如果 C 盘本来有页面文件选中 C 盘选择“无分页文件”点击“设置”将它移除一路点“确定”系统会提示重启生效这里很容易犯一个低级错误填完数字直接点“确定”没有先点“设置”。这样你填的值不会生效列表里还是原来的配置。我见过很多人配置完不生效就是因为漏了这一步。另外如果你有多个盘符一定要把其他盘原有的页面文件都清理掉只保留一个盘符上的页面文件否则系统会在多个盘上分散写入IO 碎片化反而更严重。4.3 如何验证配置是否生效配置完成后重启系统然后打开任务管理器切到“性能”选项卡点击底部的“内存”在右下角能看到“已提交”和“提交限制”。对比一下提交限制的数字如果它大约是“物理内存 你设置的最大页面文件”说明配置生效了。更精确的验证方法是打开系统信息运行msinfo32在“系统摘要”底部找到“虚拟内存”字段它会列出所有页面文件的路径和大小。或者用管理员权限打开命令提示符执行wmic pagefile list /format:list这会输出页面文件的名称、初始大小、最大大小和当前分配大小是所有验证方式里信息最全的。5. 高频 OOM 场景逐个拆解Docker、Elasticsearch、Kafka、MySQL5.1 Docker Desktop 在 Windows 上的 OOM不只是虚拟内存问题在 Windows 上跑 DockerOOM 问题的复杂度远超普通应用因为这里有两层内存限制一层是 Docker Desktop 这个虚拟机WSL2 或 Hyper-V本身的内存上限另一层是容器内部的 cgroup 内存限制。Docker Desktop 默认分配的内存是 2GB对于跑 MySQL、Elasticsearch 这类内存敏感的容器来说完全不够。很多人遇到容器的 OOMKilled 状态第一反应是调 Windows 的虚拟内存其实真正的瓶颈在 Docker Desktop 的配置里。正确的做法是打开 Docker Desktop → Settings → Resources → Advanced把 Memory 从 2GB 提到你机器物理内存的一半以上比如 16GB 内存的机器可以给 8GB。同时注意SWAP 的分配也在这里设置Docker Desktop 允许你单独配置 swap 大小这个 swap 才是容器内部看到的“虚拟内存”。但这里有个隐藏坑Docker Desktop 的 Memory 设置得再大也不能超过 Windows 的提交限制。如果你把 Docker 内存调到 12GB而 Windows 的页面文件只有 2GB物理内存 16GB那么提交限制是 18GB同时跑着 IDE、浏览器、数据库很容易把提交量顶满触发 Windows 层面的 OOM。所以 Docker OOM 的排查顺序应该是先看容器日志和 Docker Desktop 的资源分配再看 Windows 的提交限制和页面文件配置两层一起调才能根治。5.2 Elasticsearch 在 Windows 上的 OOMJVM 堆与文件系统的双重博弈Elasticsearch 是基于 Java 的它的 OOM 现象有很强的迷惑性。ES 进程默认从物理内存里分配 JVM 堆但它同时依赖操作系统文件缓存page cache来缓存索引数据。如果你把 JVM 堆设得很大留给文件缓存的内存就变小反过来JVM 堆设得太小查询和聚合经常触发 GC 或 OOM。ES 官方推荐 JVM 堆大小是物理内存的一半并且不要超过 32GB超过 32GB 后 JVM 会关闭压缩指针内存利用率大幅下降。在 Windows 上这个“物理内存”的参考值应该是扣除 Docker 等虚拟化占用后的实际可用内存。如果你的 ES 装在 Windows 上并且频繁 OOM还有一个常被忽视的点ES 的bootstrap.memory_lock配置。在 Linux 上这个配置用于锁定内存防止被换出在 Windows 上锁定的行为不同但如果你同时设置了较大的 JVM 堆和较小的页面文件Windows 会把部分 JVM 堆页面换到页面文件里导致 GC 暂停时间急剧拉长最后表现为 Java 进程 OOM 或被系统杀掉。针对这个场景我的建议是JVM 堆按物理内存的一半设置页面文件设置 1 到 1.5 倍物理内存并且放在 SSD 上。当 jvm 堆使用率达到 85% 以上时立刻调大 ES 的堆而不是去调虚拟内存因为 ES 的 OOM 有 80% 是堆不够用不是系统内存不够。5.3 Kafka 的 OOM页缓存导向的进程不要乱调堆Kafka 是另一个容易误诊 OOM 的典型。Kafka 的核心设计是“零拷贝 页缓存”它不依赖 JVM 堆来缓存消息而是尽量使用操作系统的页缓存来加速读写。所以 Kafka 的 JVM 堆通常只需要 4GB~6GB你把这个值调得再大对性能的帮助也有限反而增加了 GC 压力。但 Kafka 在 Windows 上运行时OOM 往往不是 JVM 堆的问题而是句柄数、内存映射文件和虚拟内存提交量的问题。Kafka 的日志段是使用 MappedByteBuffer 映射到虚拟地址空间的当分区数很多、日志段文件很多时虚拟地址空间和提交量会快速膨胀。Windows 的默认提交限制如果不够大Kafka 进程可能直接抛 OutOfMemoryError但这个 OutOfMemoryError 的本质是虚拟内存不足不是堆不足。在 Windows 上跑 Kafka页面文件的初始大小建议直接设为物理内存的 1.5 倍最大大小设为 2 倍否则一旦有短时的消息积压系统提交量暴涨Kafka 很容易挂。5.4 MySQL 和 Node.js 构建场景中的内存不足MySQL 的 OOM 相对来说更直白innodb_buffer_pool_size设置过大导致整个 MySQL 进程占用的内存超过了系统可用内存。在 Windows 上MySQL 的性能监控不如 Linux 生态方便所以你需要自己在系统层面盯紧两个指标任务管理器里 MySQL 进程的内存占用以及系统的“提交量”。一个合理的 MySQL 内存规划是innodb_buffer_pool_size 设为物理内存的 60%~70%如果同一台机器还要跑其他服务下调到 50%。MySQL 的 OOM 跟虚拟内存的关联在于当物理内存不足时Windows 会尝试把 MySQL 的部分内存页面交换到页面文件这个过程会让查询响应时间飙升最终可能导致连接超时看起来就像挂了。Node.js 构建场景大家可能更熟悉跑npm run build或 Webpack 打包时经常报JavaScript heap out of memory这其实不是 Windows 的 OOM而是 Node.js 的 V8 引擎堆内存上限被触发了。修复方式很简单在命令行里设置环境变量set NODE_OPTIONS--max-old-space-size4096或者在使用者 package.json 的 scripts 里直接带上这个参数。这个场景跟虚拟内存的唯一关联是如果你物理内存很小V8 进程实际占用的内存会被系统换到页面文件拖慢构建速度但报错本身不受页面文件影响。6. GPU 虚拟内存与 SSD 优化的进阶话题6.1 GPU 的“虚拟内存”和 CPU 的虚拟内存不是一回事最近几年深度学习、AI 绘画等应用普及后网上开始大量出现“GPU 虚拟内存不足”“显存不足但能调虚拟内存吗”这类问题。严格来说大多数 GPU 应用比如 PyTorch、TensorFlow在显存不足时报的是CUDA out of memory这个不是 Windows 虚拟内存能解决的——Windows 的共享 GPU 内存Shared GPU Memory可以借用系统内存充当显存但 CUDA 默认只会使用专用显存不碰共享内存。如果你在 Windows 上用显卡跑 AI 模型遇到显存不足的报错可以考虑两个方向一是换更小的模型或开启模型量化二是在特定软件比如某些视频剪辑软件里把“GPU 内存下限”调高让驱动更积极地把数据载入共享 GPU 内存。后者本质上是在用系统物理内存和页面文件充当显存的溢出区这种情况下页面文件的大小会直接影响 GPU 任务能否继续跑。NVIDIA 控制面板里的“管理 3D 设置”中有“CUDA 系统内存回退”策略默认是“启用”但实际上驱动程序对共享内存回退的使用非常保守。如果你想让它更积极地使用系统内存确保页面文件设置得足够大否则驱动不会冒险把数据放在随时可能不够的虚拟内存里。6.2 SSD 做虚拟内存的一线设置经验经过对大量用户问题的观察和实测SSD 上的虚拟内存设置有几个值得分享的细节。第一不要把页面文件设在系统盘以外的一块低速存储上。有人为了“保护 SSD”把页面文件放到了机械硬盘结果系统卡顿明显因为虚拟内存的随机 4K 读写速度直接决定了换页性能机械盘的 4K 性能比 SSD 差了几十倍。以我实测的数据一块普通 SATA SSD 的随机 4K 读取延迟在 0.1ms 左右机械硬盘要 10ms 以上。页面文件在机械盘上系统一旦开始换页整体会卡到没法用。第二设置固定大小而不是系统托管可以减少 SSD 的垃圾回收压力。系统托管模式下页面文件的物理位置不断变化触发更多的闪存写入放大。固定大小后页面文件占据连续空间写入模式相对稳定对 SSD 寿命更友好。第三如果你买了内置 HMBHost Memory Buffer的 NVMe SSD比如一些入门款无 DRAM 缓存的产品它们会主动向系统申请一小块内存作为缓存。这时你要保证系统的提交限制足够宽裕否则某些 SSD 厂商的驱动会自动降低 HMB 大小影响磁盘性能。7. 配置完成后如何观察与止损监控指标和维护习惯配置完虚拟内存并不代表万事大吉你需要通过系统监控来判断设置是否合理。最常规的手段是打开“资源监视器”运行resmon切到“内存”选项卡观察“硬错误/秒”这个指标。这个数字代表每秒从页面文件换入数据的次数长期大于 5 说明物理内存严重不足页面文件在拼命兜底你的虚拟内存再大也只是让系统不死体验照样卡。这时候应该做的不是继续调大页面文件而是删减开机自启项目、关闭不用的常驻内存进程或者认真考虑加一条内存条。虚拟内存只是防止崩溃的兜底方案它不可能替代物理内存的性能。另一个维护习惯是定期清理页面文件碎片。固定大小的页面文件没有明显的碎片问题但系统托管模式下页面文件可能膨胀到几倍于初始大小这时候想收缩只能把它删除再重建。具体操作是在虚拟内存设置里选“无分页文件”重启再重新配置自定义大小这样页面文件会重新生成一个干净的连续空间。对于开发和运维人员建议日常盯紧任务管理器里“已提交”和“提交限制”的比例。我给自己定的规则是当已提交量长期超过提交限制的 75% 时就会排查是否有内存泄漏的进程。这个比例在任务管理器里可以通过添加“内存 - 提交量”列直接看到非常直观。8. 不同 Windows 版本的差异化配置Win10、Win11、Windows Server 20168.1 Win10 与 Win11 的差异点Win10 和 Win11 在虚拟内存机制上没有本质区别但有几个细节值得提。Win11 对内存压缩Memory Compression的使用比 Win10 更积极所以系统托管的页面文件可能会增长得更慢因为更多内存页面被压缩存放而非写盘。这给配置带来的影响是如果你习惯用任务管理器观察已提交量Win11 里已提交量可能比 Win10 更早接近提交限制但实际卡顿感却没有那么明显。另外Win11 的设置面板里虚拟内存的入口层级更深了导致不少人在“设置 → 系统 → 系统信息 → 高级系统设置”这个迷宫里绕晕。我给朋友远程指导时通常直接让他们按 WinR输入sysdm.cpl一步到位打开系统属性然后按前文路径进入虚拟内存设置。8.2 Windows Server 2016 与服务器场景的独有考量Windows Server 2016 在企业环境里仍然有不少存量。它的虚拟内存配置与桌面版逻辑相同但有两点额外需要注意。一是 SQL Server 等大型数据库服务对锁定内存页Lock Pages in Memory有特殊要求。这个权限默认只分配给管理员如果你想让 SQL Server 使用的内存不被换出到页面文件需要在本地安全策略或组策略中把Lock pages in memory权限授予 SQL Server 服务账户。但是要注意启用了锁定内存后SQL Server 使用的内存不会进入页面文件如果物理内存不够其他进程就会更早触发 OOM配置时需要全局考虑。二是服务器上如果有“自动内存转储”的需求调试蓝屏问题页面文件的初始大小必须足够容纳物理内存的 80%~100%。在一个 64GB 内存的 server 上这意味着页面文件要设置在 50GB 以上。很多运维人员为了省磁盘空间把页面文件设成 4GB结果系统蓝屏后压根不生成 dump或者生成不完整给事后排查挖了个大坑。8.3 服务器上的页面文件最佳实践我给 Windows Server 的建议是页面文件放在独立的数据盘或日志盘上大小设置为物理内存的 1 倍到 1.5 倍固定大小初始大小等于最大大小。这样既能满足系统正常的换页需求又能容纳崩溃转储还不会因为动态扩展导致 IO 抖动。如果你的服务器是纯数据库节点物理内存足够大比如 128GB 以上页面文件甚至可以降级为一个固定 4GB 的“兜底 转储用”文件剩下的交给物理内存。9. 常见误区澄清与实用技巧合集9.1 “虚拟内存设为物理内存的 1.5 倍”这种老说法还有效吗很多老教程还在流传“虚拟内存设为物理内存的 1.5 倍”的说法这是从 Windows XP 时代留下来的经验当时物理内存普遍只有 256MB~1GB页面文件的设置逻辑完全不同。在现代 8GB 起步、16GB 主流的时代这个公式已经严重过时。根据我前面给出的表格32GB 内存的机器页面文件只要 8GB~16GB远低于 1.5 倍的 48GB。设置过大并没有实质好处只会浪费 SSD 空间、增加系统在磁盘上寻找可用空间的负担。正确的思路永远是先保证物理内存充足页面文件只作为缓冲和兜底。9.2 完全禁用页面文件可行吗不建议。完全禁用页面文件虽然能让系统的提交限制精确等于物理内存看起来更“干净”但会带来两个现实问题第一某些软件和游戏在启动时直接检查页面文件是否存在禁用了会报错或拒绝启动。第二系统发生蓝屏时无法写入内存转储文件崩溃后的排障变得极其困难。第三当一个进程申请内存的速度过快时比如游戏加载新关卡Windows 没有页面文件作为缓冲可能直接进程崩溃而可用的替代方案比如增加物理内存成本远高于保留一个小页面文件。所以我的建议是即使你内存很大也保留一个 2GB~4GB 的页面文件放在系统盘上固定大小。成本几乎为零但能避免绝大多数兼容性问题。9.3 注册表级别的虚拟内存微调对于喜欢折腾的用户Windows 还提供了一些注册表级别的内存管理选项但需要谨慎使用。以下是我认为值得尝试的两项DisablePagingExecutive位于HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management设置为 1 时内核和驱动代码始终驻留物理内存不会被换出。适合内存充裕的专业工作站但如果内存紧张这个设置会显著减少可用内存甚至导致驱动加载失败。LargeSystemCache设置为 1 时系统会优先用内存缓存文件数据适合文件服务器场景但会减少用于应用进程的空间。这个选项在新版 Windows 上默认关闭普通用户不建议开启。这些调整的本质是改变系统对内存和页面文件使用的倾向性而不是“开启某项隐藏性能”。对大多数场景来说保持默认值就是最稳妥的选择。9.4 排查 OOM 问题时最常见的三个粗心错误结合我上面的大量分析在排查 OOM 时有三个错误几乎每个人都会犯第一个错误是只看任务管理器的“内存”占比不看“已提交”数据。任务管理器内存页面的百分比是指物理内存的实时占用率而 OOM 触发往往是因为提交量超限。一个进程分配了 5GB 虚拟内存但没实际使用任务管理器物理内存可能显示 60%但提交量已经悄悄涨了 5GB。第二个错误是把应用层的 OOM 误判为系统级 OOM。前文提到的 Node.js heap OOM、Java 堆 OOM、CUDA out of memory都不是 Windows 虚拟内存能解决的。如果连问题根源都没找准调什么都是白费。第三个错误是调完页面文件不重启。虚拟内存设置的生效必须重启很多人改完数值后直接继续用发现问题还在就误以为配置没用。记住修改页面文件后系统提示重启那就老老实实重启这一步绕不过去。10. 最后分享一个我常用的排查套路如果你已经按照上面的内容配置好了虚拟内存但 OOM 还是不期而至我建议你把排查过程做成一个固定套路而不是每次从头瞎猜。第一步打开任务管理器 → 性能 → 内存看三个数字已提交、提交限制、物理内存占用率。如果已提交接近提交限制说明系统级内存资源见底按本文思路检查页面文件如果物理内存占用率接近 100% 而已提交离提交限制还有很大距离说明某个进程在疯狂吃物理内存打开“详细信息”选项卡按“内存”列排序找到元凶进程。第二步对元凶进程做针对性分析。如果是浏览器考虑减少标签页或换用内存占用更低的浏览器模式如果是 Docker 容器进入容器内部看 cgroup 的 memory.limit如果是 Java 应用用jstat或者jmap -heap看 JVM 堆与实际内存占用。第三步检查 Windows 事件查看器里的“应用程序日志”和“系统日志”过滤来源为Application Error、Windows Error Reporting的事件。很多时候 OOM 崩溃会留下具体的错误模块信息甚至指向某个有内存泄漏的驱动。这套流程虽然简单但能帮你快速定位大部分 OOM 的根因。我现在处理线上问题和远程帮人排查几乎从不直接改虚拟内存——那是因为我会先花五分钟看完这几个数据然后再决定动哪里。希望这篇文章能帮你在下次处理“内存不足”时直接绕过大多数人都会踩的坑。
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻