第一次被"虚拟内存不足"的弹窗教育,是在帮朋友维护一台老工作站的时候。那台机器只有8GB物理内存,开个浏览器再挂一个轻量虚拟机,系统就开始频繁弹窗,接着就是程序闪退、鼠标漂移、整机卡到怀疑人生。排查了两天,中间还换过一次内存条,结果问题出在页面文件的配置和系统盘剩余空间上——内存条白换了。
"Windows虚拟内存不足"这个提示,几乎每个Windows用户迟早都会遇到一次。它看起来像一句废话,但背后可能是物理内存吃满、页面文件设置异常、系统盘空间告急,甚至某个程序的地址空间分配问题。这篇文章想把排查思路和实操步骤完整写一遍,从原理说到操作,最后附一份常见问题速查,适合正在被弹窗困扰的人,也适合做运维、装机、帮人修电脑的从业者参考。
1. 先把虚拟内存这件事说透
1.1 虚拟内存到底是什么
虚拟内存这个词其实有点误导,它并不是一个真实存在的硬件。Windows里的虚拟内存,本质上是一套"内存地址空间管理机制"。每一个进程运行的时候,都以为自己拥有一整块连续的地址空间,这块地址空间由物理内存和磁盘上的页面文件共同支撑。物理内存不够用的时候,Windows会把暂时用不到的数据挪到磁盘上的pagefile.sys文件里,腾出物理内存给正在活跃的程序,这个过程叫换页。
用一个生活化的类比来解释:物理内存相当于你的办公桌面,页面文件相当于旁边的抽屉柜。桌面上摆满了文件没地方干活了,就把不常用的资料收进抽屉,要用的时候再拿出来。抽屉柜太小,桌面很快就会堆不下;桌面本身不够大,再怎么折腾抽屉柜也解决不了根本问题。这个比例关系,后面排查时会反复用到。
还需要区分"物理内存"和"虚拟地址空间"这两个概念。64位系统上,单个64位进程的虚拟地址空间能达到TB级别,但物理内存通常只有8GB、16GB。虚拟内存机制解决的就是这个矛盾——让多个进程共享有限的物理内存,同时给每个进程留出足够的地址空间。32位进程则比较特殊,默认只能访问约2GB的虚拟地址空间,这个问题后面专门展开讲。
1.2 说"不足"时,系统其实在抱怨什么
"虚拟内存不足"这句提示,对应的实际上有两种情况。
第一种是页面文件确实太小,系统无法完成换页操作。物理内存被占满后,数据要往页面文件里写,结果页面文件也满了,Windows就只能报错。
第二种情况更容易被忽略:Windows存在一个"提交限制"的概念,它的值等于物理内存大小加上所有页面文件的大小。每个进程申请内存时,Windows记录的是"承诺分配"的量,而不是进程立刻实际使用的量。比如一个进程申请了2GB内存,但只写了500MB进去,在系统的提交记录里,这2GB已经被占用了。当所有进程的"已提交内存"总量逼近提交限制时,即使物理内存还没用光,系统也会拒绝新的内存分配请求,弹窗提示虚拟内存不足。
这就是为什么有些人的机器物理内存明明还有剩余,却一样会报"虚拟内存不足"。问题不在物理内存,而在提交总量触顶。任务管理器的"性能"页签里能看到"提交"和"提交限制"两个指标,前者逼近后者,就是典型的提交量触顶局面。
提示:提交限制 = 物理内存 + 页面文件大小。这条公式是整个虚拟内存排查的核心。很多人忽略页面文件,却不知道关掉页面文件等于把提交限制直接压到物理内存的水平。
2. 哪些原因最容易触发虚拟内存不足
2.1 物理内存长期吃满:最常见的第一导火索
大部分虚拟内存不足的场景,根源还是物理内存不够用。浏览器开几十个标签页、虚拟机常驻、大型IDE挂着编译、后台还跑着各种服务,物理内存占用长时间维持在高位。系统被迫反复换页,页面文件读取写入非常频繁,一旦页面文件大小不够,马上就会触发弹窗。
我见过不少8GB内存的机器,跑Windows 10/11加个浏览器加个聊天软件就已经紧巴巴,再开虚拟机或者Office大型文档,内存直接满。16GB内存的机器也并非高枕无忧,同时开虚拟机、容器、模拟器、浏览器深沉睡眠不准回收的多标签页,一样能撑爆。这里说的"撑爆",不一定指物理内存百分比达到100%,而是提交量已经接近限制值。
物理内存长期吃满时,系统的行为是不断把进程的休眠页面写进页面文件。如果你观察任务管理器,会发现内存占用持续波动,磁盘活动也很高,但进程列表里并没有哪个程序特别夸张——这种情况通常是多个中等内存占用的程序叠加,或者内核缓存被大量消耗。
2.2 页面文件设置过小或被人为关掉
网上流传着不少"优化教程",教人把虚拟内存设置成固定小值,甚至直接禁用页面文件。禁用页面文件的论据是"我物理内存够大,不需要磁盘换页"。这个做法短期可能看不出问题,但风险很大。
关掉页面文件之后,系统提交限制直接降到物理内存大小。假设你有16GB内存,系统提交限制就是16GB。现在你打开一个游戏,游戏申请了12GB提交内存,后台再挂着浏览器、音乐软件、输入法,提交总量很容易突破16GB。这时候系统不会跟你商量,直接弹"虚拟内存不足"。
还有一个很多人不知道的点:一些专业软件和大型游戏在启动时会检查页面文件是否存在,检测不到就直接拒绝运行或报错。Adobe系软件、部分3D渲染工具都有这个习惯。Windows自身的一些功能也依赖页面文件做虚拟地址保留,比如崩溃转储、内核转储,这些机制在页面文件缺失时会失效。所以我一直建议,无论物理内存多大,都要保留一个最小1GB到2GB的页面文件,就当是给系统留一道安全阀。
2.3 系统盘剩余空间告急
页面文件默认在C盘根目录下,文件名为pagefile.sys,看不见它是正常的,因为它被系统隐藏了。当设置是"系统管理的大小"时,Windows会根据需要自动伸缩页面文件,但这个伸缩行为有一个硬前提:C盘得有足够的剩余空间。
C盘剩余空间不足时,页面文件无法增长,提交限制就被卡死。这种情况在Windows 10/11上非常常见,因为系统更新缓存、休眠文件、临时文件、回收站都会持续挤占C盘空间。用户往往只盯着"虚拟内存不足"的提示,却忽略了对磁盘剩余空间做检查。实际上先看一眼C盘还有多少空间,十次里面能省下五次排查时间。
2.4 应用内存泄漏与32位进程地址空间限制
内存泄漏是另一个隐蔽的元凶。程序长时间运行,不断申请内存却不释放,进程的提交大小甚至物理内存占用会持续上涨。浏览器长时间挂着不关,是普通用户场景里最常见的内存泄漏来源。做开发的人还会遇到Java应用堆参数没调好导致的OOM,以及驱动层面的内存池泄漏。
32位进程的地址空间限制则独立于系统虚拟内存之外。一个32位的程序,单进程虚拟地址空间上限默认约2GB,就算你的机器有64GB物理内存,这个程序最多也只能用到那2GB的地址空间。如果它申请的内存逼近上限,就会报"内存不足"或"无法分配内存",但这时候系统的虚拟内存其实非常充足。判断方法很简单:看报错的是不是只有那一个程序,其他程序都正常,重装或换64位版本即可。
3. 按步骤排查,别一上来就改设置
3.1 先看当前页面文件和内存占用
遇到"虚拟内存不足",第一反应不应该是直接改设置,而是按顺序确认三样东西:当前页面文件大小、当前的提交量、系统盘剩余空间。
查看页面文件设置,最快捷的方式是Win+R打开运行框,输入sysdm.cpl回车,切到"高级"选项卡,在"性能"区域点"设置",再切到"高级",点"虚拟内存"区域的"更改"。这个界面里能看到"自动管理所有驱动器的分页文件大小"是否勾选,以及每个盘符对应的页面文件信息。
查看内存占用,打开任务管理器(Ctrl+Shift+Esc),切到"性能"页签,左侧选"内存"。右下角有两个关键指标:"提交"和"提交限制"。提交显示的是系统当前所有进程的已提交内存总量,提交限制显示的是系统可以达到的上限。如果"提交"数值已经占到"提交限制"的85%以上,说明提交压力已经很大。
再看系统盘剩余空间,打开"此电脑"看一眼C盘。碰到页面文件在C盘、C盘空间又只剩几个GB的情况,基本可以确定虚拟内存不足与页面文件无法扩容有关。
3.2 判断是"真不够"还是"假警报"
完成基础信息收集后,需要做一个快速判断,避免被表面现象带偏。
如果所有程序都在报内存不足,系统整体响应极慢,任务管理器里的提交量又逼近提交限制,这是真的虚拟内存不够,处理方向是扩大提交限制,也就是增加物理内存或扩大页面文件。
如果只有某一个程序反复报"内存不足",其他程序一切正常,优先怀疑这个程序自身的地址空间或内存管理问题。32位程序报错,先去网上确认有没有64位版本;如果有,换64位版本基本能解决。
如果开机就弹"虚拟内存不足",还没进桌面就开始提示,这通常不是内存压力问题,而是页面文件配置异常,比如被指向了一个不存在的盘符,或者系统盘可用空间为0。这种情况不需要加内存,进入安全模式或通过系统配置把虚拟内存设置恢复为"系统管理的大小"即可。
还有一种情况容易被误判:物理内存占比看着不高,比如只有60%,但提交量已经触顶。这种场景说明有大量"只申请不使用"的内存提交,常见的元凶是某些后台服务或运行库自我膨胀。排查时要重点看提交量,而不是只看物理内存百分比。
4. 调整虚拟内存的标准操作
4.1 手动设置页面文件的推荐值
确认问题确实出在页面文件设置之后,再动手改。操作路径还是刚才那个界面:sysdm.cpl → 高级 → 性能设置 → 高级 → 虚拟内存更改。
先在"虚拟内存"窗口里取消勾选"自动管理所有驱动器的分页文件大小",然后选中C盘,点选"自定义大小",在"初始大小"和"最大值"两栏填数值,点"设置"按钮确认,最后逐层点"确定"退出。
推荐值到底怎么定,网上说法很杂。老教程喜欢说初始值设为物理内存的1.5倍,最大值设为3倍,这个公式源于多年前物理内存只有512MB、1GB的时代,放到今天已经不够精确,但用来做参考基准没有问题。更实用的参考区间是:
- 物理内存8GB及以下:初始值4096MB,最大值8192MB,必要情况下允许Windows自动管理
- 物理内存16GB:初始值8192MB,最大值8192MB,即固定值8GB,或者保持系统托管
- 物理内存32GB及以上:保持"系统管理的大小"即可,除非软件有特殊要求,才手动设一个固定值16GB
为什么建议初始值等于最大值?因为页面文件自动伸缩时,系统需要花时间去扩展文件,这会带来磁盘IO抖动,也会在系统盘上留下碎片。固定值能消除这种周期性抖动,代价是磁盘空间被提前占满。反过来,如果固定值设得太大,又容易浪费磁盘空间。取舍原则:C盘空间宽裕,设固定值;空间紧张,就保留系统托管。
注意:修改当前正在使用的页面文件大小之后,Windows通常会提示需要重启电脑。别嫌麻烦,重启后务必重新打开虚拟内存设置界面,确认数值已经生效。
4.2 页面文件的存放位置与多盘符配置
页面文件不是只能放在C盘。如果你的机器有多个分区或者多块硬盘,完全可以把页面文件放到其他盘,减轻C盘的负担。
但有几个原则要讲清楚。第一,C盘最好至少保留一个页面文件,哪怕设成最小值1GB都行。Windows的崩溃转储默认写到系统盘,如果C盘完全没有页面文件,系统崩溃时可能无法生成完整的dump文件。对普通用户无影响,但做运维和调试的人要心里有数。
第二,把页面文件整体挪到机械硬盘要慎重。页面文件承载的是换页操作,而换页的随机读写频率很高,机械硬盘在随机读写上的表现比固态硬盘差太多。如果为了省C盘空间把页面文件放到一块旧机械盘上,系统整体流畅度会明显下降。正确做法是,如果有多块固态硬盘,把页面文件放在非系统盘的固态硬盘上;如果只有一块固态硬盘,那就老老实实放在C盘。
第三,SSD不需要担心页面文件损耗寿命。很多人被"SSD写入寿命"的说法吓到,不愿把页面文件放SSD上。实际上,正常桌面负载下页面文件的读写量相比SSD的寿命额度可以忽略不计,一年换页写入也未必赶得上一次游戏安装写入的数据量。这个担心在2024年算是过时了。
操作上,想把页面文件从C盘迁移到D盘,先在虚拟内存设置界面选择D盘,设好大小并点"设置",然后回到C盘,选择"无分页文件"并点"设置",最后确定重启。顺序不能反,先建新的再删旧的,避免中间出现没有任何页面文件的空档。
4.3 让修改生效的注意事项
改完页面文件设置,有几件事经常被忽略。
第一,重启后要回来看一眼。我见过改完设置但忘记点"设置"按钮,结果对话框关掉所有配置白做的案例。在自定义大小页面填完数值,一定要点一下右侧的"设置",再点"确定",否则改动不会写入系统。
第二,物理内存变化后要重新评估。如果后来加了内存条,原来设的固定页面文件值可能需要调小甚至改回系统托管,否则等于白白浪费一块磁盘空间给页面文件。
第三,系统盘空间持续紧张的机器,建议顺手处理磁盘占用。清理系统更新缓存、休眠文件、临时文件,或者用磁盘清理工具把C盘空间释放出来,往往比单独调整页面文件更治本。页面文件写得再大,没有磁盘空间支撑,也只是纸上谈兵。
5. 进阶排查与工具辅助
5.1 用系统工具定位内存大户
当排查到了"确实有一个进程的内存占用异常"这一步,就需要用工具定位它。
任务管理器里的"进程"页签默认按"内存"列排序,但这列显示的是"专用工作集",也就是该进程独占使用的物理内存。仅靠这一列,往往看不出提交内存占用大的进程。解决办法是把"提交大小"列加出来:右键任意列标题,勾选"提交大小"。提交大小反映的是这个进程占用系统提交内存的总量,这才是影响提交限制的指标。
定位时还有一个技巧:观察提交大小是否持续增长。打开任务管理器记下一个进程的提交大小,过15分钟再看一眼,如果数值一路向上而且不回降,基本可以判定这个进程存在内存泄漏。
更精确的观察可以用"性能监视器"(perfmon.msc),添加以下计数器:
- Process → Private Bytes:进程的私有虚拟内存,反应提交压力
- Process → Working Set:进程的物理内存占用
- Memory → Committed Bytes:系统总提交量
把这三个计数器加进去跑上半小时,哪个进程的Private Bytes呈单调上涨趋势,哪个就是泄漏源。定位到之后,去更新软件版本或者调整配置,通常能解决问题。
5.2 内存池泄漏怎么查
有一种比进程泄漏更隐蔽的问题,叫内核内存池泄漏,表现为系统的"非分页池"或"分页池"数值异常增长。非分页池是内核中不能换出到磁盘的内存区域,通常由驱动占用。如果任务管理器内存页签里非分页池的数字持续爬升且不回落,优先怀疑某块驱动有bug。
驱动级泄漏的常见来源包括:网卡驱动、显卡驱动、主板芯片组驱动、某些外设驱动。很多莫名其妙的"内存不足",实际上是某公司的网卡驱动在长时间运行后内存越吃越多,最终把系统拖垮。
普通用户做不了太深的内核调试,但可以先尝试一个很实在的步骤:把所有驱动升级到最新版,尤其是网卡和显卡驱动。升级前如果机器上安装过各种"系统优化工具""内存加速器",先全部卸载,这类软件引入内核钩子导致内存池泄漏的案例并不少见。
如果问题依旧,想要深入到内核内存池跟踪,可以下载Windows驱动开发包(WDK)里的poolmon工具。用管理员权限运行命令行,执行poolmon,它会列出当前内核内存池的分配标签,以及每个标签对应的驱动标识。在持续增长的那个标签上查驱动名称,就能锁定目标模块。这个工具对新手很不友好,输出密密麻麻,但遇到驱动级泄漏时,它几乎是唯一的突破口。
关于内存池排查,补充一条经验:看到非分页池数值异常,先别急着怀疑系统文件损坏,优先级最高的是驱动更新和移除"优化类"软件。实际处理过的案例里,卸载某款第三方内存清理工具后,非分页池占用直接回落到正常水平的次数,比想象中多得多。
6. 常见问题速查与避坑
6.1 常见问题速查表
把排查中遇到的典型问题整理成一张速查表,方便遇到同类情况时快速对照。
| 现象 | 常见原因 | 处理方向 |
|---|---|---|
| 所有程序都报内存不足,系统卡顿 | 提交量触顶,物理内存不足或页面文件过小 | 先看任务管理器提交量,确认后扩大页面文件或增加内存 |
| 只有单个32位程序报内存不足 | 该程序地址空间达到2GB上限 | 换64位版本,或减少该程序内存占用 |
| 开机即弹虚拟内存不足 | 页面文件配置异常或系统盘毫无空间 | 进安全模式把页面文件恢复为系统托管,清理系统盘 |
| 页面文件设置后不生效 | 没有点"设置"按钮,或未重启 | 重新设置并确认按钮,重启后复查 |
| C盘空间一直告急,页面文件无法增长 | 系统盘剩余空间不足 | 清理系统盘,或把页面文件迁移到其他固态盘 |
| 非分页池持续增长 | 驱动内存泄漏 | 更新驱动,卸载优化类软件,必要时用poolmon定位 |
| 物理内存还有很多却提示不足 | 提交量触顶 | 排查提交大小大的进程,考虑关闭自动扩展内存的服务 |
6.2 几个容易踩的坑
第一个坑是完全关闭页面文件。网上"内存够大不需要页面文件"的说法流传很广,但实际后果是:某些软件直接报错、系统提交限制被压到物理内存水平、崩溃转储无法生成。哪怕物理内存64GB,我也建议保留一个最小1GB的页面文件,这是成本最低的保险。
第二个坑是把页面文件设成不合理的固定值。有人看到"初始值1.5倍、最大值3倍"的旧公式,在16GB内存的机器上设了48GB最大值,结果C盘空间不够,系统直接报警。页面文件的实际占用是动态的,最大值只代表扩张上限,不代表立刻消耗磁盘。但磁盘空间紧张的机器上,太大的最大值会让系统在扩容时失败。
第三个坑是修改页面文件后不重启就认为配置无效。更改当前活动的页面文件,Windows会提示重启,重启后应该回去确认。判断是否生效的快捷方式:打开C盘属性,如果能看到pagefile.sys文件大小与你设置的固定值一致,说明配置已生效。
第四个坑是忽略物理内存的根本性不足。4GB或8GB内存的机器,页面文件设再大也只是把机械盘或SSD当内存用,速度体验不会好。微信多开、浏览器多开、虚拟机、开发工具并存的前提下,加内存条才是出路。页面文件是缓冲垫,不是内存替身,它撑不住持续高负载。
第五个坑是迷信第三方内存清理工具。这些工具强制把物理内存中的缓存数据倒腾到磁盘,表面上看"可用内存"变大了,实际换来的是大量的换页IO和高延迟,系统真实性能反而下降。Windows的缓存机制本身设计得很好,空闲内存被用作缓存是正常现象,不需要"优化"。
第六个坑是修改页面文件时忘了NAND空间。如果你的页面文件所在分区剩余空间长期不足5GB,无论是自动管理还是固定值,系统都可能无法正常扩展页面文件。碰到"虚拟内存不足"的提示,先看一眼C盘可用空间,真的能省很多时间。
最后说一点个人体会。我处理过的虚拟内存不足案例里,真正需要换硬件的其实很少,大部分问题都出在页面文件设置、系统盘空间、以及某个程序的内存异常上。把它们按顺序排查一遍,你很快就能从"弹窗焦虑"里走出来。
写这篇还有一个私心:希望看到这里的人,下次碰到"虚拟内存不足"不要直接重启了事。重点盯住任务管理器里的提交量和提交限制,这两个数字会告诉你真实的内存压力在哪一层。如果看完只想记住一个动作,那就是别关页面文件,别乱优化,先看磁盘剩余空间和提交量。这套思路,在Windows 10和Windows 11上同样适用。