如果你手里的Windows 11电脑出现了这样一种症状:刚开机内存占用还算正常,用上几个小时之后“内存”曲线一路走高,任务管理器里“非分页缓冲池”从几百MB涨到好几个GB,系统开始卡顿、软件闪退,重启之后才能缓一阵子,那这篇就是给你准备的。我去年接手某公司一批工作站的性能排查,连续四台机器都是同样的毛病,第一反应是内存条坏了,换了两根内存条仍然复现,最后定位到是某个第三方网卡驱动在内核态反复申请非分页缓冲池却不释放。这类问题在Windows 11上出现的频率比很多人想象得高,而且表现往往藏得很深。这篇文章我会把排查思路和最终解决方案完整地写出来,包括你能直接抄作业的命令、工具和判断标准。1. 别急着换硬件:先搞懂非分页缓冲池为什么“只借不还”1.1 非分页缓冲池是内核的“固定工位”很多人第一次听到“非分页缓冲池”这个概念,是在任务管理器加上那一栏之后。说白了,非分页缓冲池(Non-Paged Pool)是Windows内核使用的一块特殊内存区域,它和普通用户程序占用的内存有个本质区别:里面的内存页不允许被换到磁盘上的页面文件里。内核为什么这么任性?因为很多底层代码运行在中断、延迟过程调用(DPC)或者驱动分发例程里,这些地方一旦触发缺页异常,整个系统就可能蓝屏。所以只要内核和驱动提出“我需要一块内存来干底层活”,系统就把物理内存直接划给它,不上锁不换页,随叫随到。为了方便理解,你可以把物理内存想象成一个写字楼。普通程序占用的是“可搬走的临时工位”,忙完了可以把资料搬到仓库(页面文件)去腾地方。而非分页缓冲池是“固定工位”,人必须一直坐在那里,因为有些紧急任务随时可能要找他,不能等你去仓库搬资料再回来。那么正常情况下这个“固定工位”应该有多少人?在Windows 11上,刚启动完成之后,非分页缓冲池一般只有几十MB到两三百MB;系统用了一段时间后,因为网络、存储、显卡等驱动都会申请和释放这个池,数值上下浮动几百MB是正常的。但如果它呈现单边上涨的趋势,比如每小时多几百MB,而且一路涨到几个GB也不回落,那就不是正常浮动了,而是内核态代码申请了内存之后忘记释放,这就是典型的非分页缓冲池泄漏。1.2 为什么Windows 11上这类泄漏特别容易冒出来我观察到一个现象:不少用户是升级到Windows 11之后才开始遇到这个问题的,同样的机器、同样的驱动,在旧系统上明明很安静。这不是错觉,主要有几个原因。首先是驱动老化与系统架构升级之间的矛盾。Windows 11对内核隔离、内存完整性(VBS/Memory Integrity)的支持力度明显加大,很多老驱动在新环境下加载路径变了,内存申请和释放的配对逻辑出现漏洞,表现为池内存只增不减。其次是现代硬件的驱动复杂程度远超过去。NVMe固态硬盘、Wi-Fi 6/7无线网卡、高刷屏幕、雷电接口,这些硬件在内核态处理大量I/O请求,每次I/O都可能申请非分页缓冲池。驱动写得不严谨,高频场景下漏一次内存申请是几乎发现不了的,但架不住每天成千上万次操作,漏着漏着系统就垮了。还有一个很容易被忽略的因素:快速启动和现代待机(Modern Standby)。Windows 11默认开启快速启动,关机实际上是“注销用户会话+保存内核休眠文件”,唤醒时内核和驱动要恢复状态。有些第三方驱动在休眠恢复过程中,只恢复了功能却没有恢复内存池状态,导致每一次开关机,非分页池就高出一截。这种泄漏不是开机时马上爆炸,而是一天下来数字越堆越高,重启后短暂回落,很多人误会成“电脑用久了就是会卡”。另外,第三方杀毒软件、游戏反作弊组件、云同步工具的内核过滤驱动,也都是非分页池的“大客户”。它们喜欢在文件读写、进程创建时切入系统内核,每切入一次就要分配内核内存。这些软件通常不会像系统驱动那样严格做内存回收测试,成了内存泄漏的温床。2. 四类工具交叉定位:任务管理器只能告诉你“满了”,要这样定位2.1 先从任务管理器和资源监视器建立基准排查的第一步永远是确认症状,而不是凭感觉。按下Ctrl+Shift+Esc打开任务管理器,切到“性能”页签,点“内存”,你会看到“非页面缓冲池”这一行。别急着下结论,先把数值记下来,连续观察30到60分钟。如果初始值是300MB,一小时后变800MB,两小时变1.5GB,这个增长轨迹就是泄漏的铁证。单纯看任务管理器仍有盲区,因为它只告诉你“有多少”,不告诉你“被谁占了”。所以紧接着打开资源监视器(Win+R输入resmon),看“内存”页签。这里有个常见误区:很多人看到“为硬件保留的内存”显示好几GB,就以为系统偷了内存。其实这部分是CPU和显卡预留的硬件地址空间,一般不参与软件分配,你不需要为它烦恼。真正值得关注的是“已提交”和“硬错误”两个指标。已提交内存是系统承诺给程序的内存总量,包含物理内存和页面文件;硬错误则代表程序访问的数据不在物理内存里,必须从磁盘读取。如果非分页池一直在涨,同时硬错误频繁,说明物理内存被内核占掉了太多,用户程序被迫大量换页,系统自然又慢又卡。2.2 性能监视器记录连续曲线:让数据替你说话资源监视器能看即时状态,但要想得到一份“案发现场”级别的趋势图,需要用到性能监视器(perfmon)。Win+R输入perfmon,展开“数据收集器集”,右键“自定义”新建一个数据收集器集,选择“手动创建”,加四个计数器:Memory\Pool Nonpaged Bytes(非分页池总量)Memory\Pool Paged Bytes(分页池总量)Memory\Available MBytes(可用内存)Memory\Committed Bytes(已提交内存)采样间隔我建议10到15秒一次,不要用默认的1秒,否则日志文件会膨胀得很快。让它跑一两个小时,然后打开报表,重点观察Pool Nonpaged Bytes曲线。如果曲线是持续爬升,中间很少回落,说明存在有规律的内核池申请;如果曲线像锯齿一样不断冲高又回落,那可能只是瞬时负载高,不是真正的泄漏。这一步能帮你分辨“内存占用高”和“非分页池泄漏”是不是同一个问题。很多时候,用户抱怨内存占用高,结果实际是高的是“缓存”或“已提交”,跟非分页池没关系。只有非分页池持续上涨才是内核态泄漏,其他的高占用问题解决方案完全不同。2.3 RAMMap快速筛出提交量和驱动锁定的内存判断完趋势,下一步是看“谁在占用”。RAMMap是一个单文件的绿色小工具,功能和任务管理器类似,但维度多得多。打开之后第一眼看“Use Counts”,里面有一个“Driver Locked”分类。这个分类表示被驱动锁定在物理内存里的页面,它和非分页池关系紧密。如果Driver Locked的数值高达好几GB,那基本可以断定内核驱动在大量锁内存。接着切到“Processes”页签,按“提交”列排序。正常排序前列应该是浏览器、开发工具、虚拟机这类大程序。如果排名第一的是一堆不明进程,或者某个驱动宿主进程异常高,那就要顺着这条线查下去。需要提醒的是,RAMMap界面上的“Empty”按钮可以清空工作集、系统工作集、备用列表等,操作之后内存占用数字会立刻降下来,网上很多人拿这个当“内存清理神器”。但你要明白:它只是让物理内存页面被释放归还,并不解决驱动申请不释放的根因。如果真有内核态泄漏,用完Empty之后,非分页池数值纹丝不动,过一会儿其他池又涨回去。所以RAMMap的正确用法是“快速分诊”,不是“治疗”。2.4 poolmon:抓泄露内核标签的核心工具真正能精准定位到“哪一类内核操作在泄漏”的,是poolmon工具。它是Windows驱动开发包里自带的调试小工具,体积不大,但威力很强。以管理员身份打开命令行,运行poolmon,界面上会刷出一堆标签(Tag)、类型(Type)、分配次数、释放次数和差值(Diff)。我习惯用poolmon /p /g组合参数:/p只显示非分页池,/g按增长量排序,这样正在暴涨的Tag会自己浮到最上面。怎么读结果?先让电脑闲下来,关掉大程序,然后让poolmon跑20分钟。重点看NonPaged类型的Diff列,哪个Tag的Diff值持续变大,哪个Tag就在泄漏。所谓Tag,是内核内存块的“身份证”,驱动申请内存时可以用4字符标签标记用途,比如网络相关的常见标签有NdIS、NmP,存储过滤驱动的有Fsd、File等。poolmon的问题在于,它告诉你Tag却不直接告诉你哪个驱动文件。这时候除了经验联想,还要配合两种手段:一是用WinDbg打开内核转储后执行!poolused 2命令,它按Tag分组并显示所属驱动;二是最笨但最有效的“实证隔离法”,只保留一个候选驱动运行,观察对应Tag是否还在涨,谁涨谁就是责任人。这套组合拳打下来,绝大多数泄漏源都跑不掉。3. 驱动排查是重头戏:从poolmon标签到驱动验证器的完整链路3.1 PoolTag到.sys的三种追踪姿势如果你的poolmon已经锁定了某个Tag,接下来要做的是把Tag翻译成具体的.sys文件。第一种方法是用WinDbg附加到系统或者分析dump文件,然后执行!poolused 2。这个命令会输出一个表格,每个Tag一行,最右边就是分配这个内存的模块名。看到模块名之后,在C:\Windows\System32\drivers目录里找同名文件,右键查看“详细信息”里的产品名和公司名,幕后黑手基本就浮出水面了。第二种方法是看驱动的加载顺序和依赖关系。Win+R输入driverquery /v,能看到所有内核驱动和服务。虽然不是所有泄漏Tag都能直接对上号,但把可疑Tag的常见归属整理成“嫌疑名单”,再辅助网络搜索该Tag对应的常见驱动,往往能缩小范围。第三种就是前面说的“实证隔离法”,也是我最推荐新手用的。因为poolmon和调试器对很多人来说门槛偏高,而隔离法不需要理解内核原理:先把系统进入干净启动状态(msconfig里禁用所有非必要服务),此时非分页池增长应该会明显放缓。然后手动加载一个驱动组,观察tag是否暴涨;再禁用一组,再加载另一组。这样两三轮下来,即使你不完全理解Tag含义,也能用排除法把泄漏驱动圈到只剩一两个。3.2 外围设备驱动排查清单和顺序根据我处理的案例,非分页池泄漏的高发驱动按概率排序是这样的:驱动类型内核态行为常见泄漏场景有线/无线网卡NDIS网络栈处理收发包高吞吐下载、休眠唤醒、Wi-Fi漫游显卡驱动WDDM模型提交显示命令游戏画面切换、多屏输出、视频硬件加速存储驱动NVMe/RAID命令处理磁盘连续大量读写、磁盘睡眠唤醒蓝牙驱动蓝牙协议栈资源分配蓝牙设备频繁断连重连安全软件过滤驱动监控文件与进程操作每次下载、每个新进程都要扫描一遍排查顺序建议从网络驱动开始,理由是NDIS驱动是内核态I/O最频繁的类型之一,而且很多第三方网卡驱动为了追求性能,习惯用自己的内存池来缓存数据包,写得不严谨非常容易漏释放。具体做法是打开设备管理器,找到网络适配器,右键卸载设备,注意勾选“删除此设备的驱动程序软件”,然后去硬件厂商官网下载当前芯片型号已知稳定的驱动版本,重新安装。别用第三方驱动管理工具一键更新,我见过太多“自动更新”把驱动换成错误分支的案例。如果是笔记本,蓝牙和无线网卡往往是同一个模块,建议同步更新。显卡驱动排查优先级排在第二位,特别是那些老核显驱动搭配新显卡驱动混装的情况,非常容易出现内核池冲突。这时需要用显卡驱动自带的干净安装模式,或者到设备管理器里先卸载显卡驱动,重启后重新安装完整驱动包。3.3 驱动验证器使用前必须知道的三件事当你通过poolmon锁定了某个驱动,但还想确认它确实是“凶手”时,可以用Windows自带的驱动验证器(verifier)做终极审判。以管理员身份打开命令行,执行:verifier /standard /driver 可疑驱动路径\可疑驱动.sys/standard是标准验证集合,会对内存申请长度、释放配对、DMA操作等做严格检查。然后重启电脑,系统会在加载该驱动时进行高强度压力测试,如果驱动真的有问题,通常会很快蓝屏,并生成转储文件,你可以用WinDbg分析到底哪行代码出了问题。但使用drv验证器前,有三件事必须提前知道。第一,千万不要一次性对所有驱动启用验证,否则开机极大概率直接卡死在加载阶段。我有个同事曾图省事直接verifier /standard全选,结果每一台测试机都进不了系统,最后只能进安全模式执行verifier /reset。第二,验证期间蓝屏是“预期行为”,不要慌张,蓝屏后重启进安全模式,去C:\Windows\Minidump把dmp文件保存好,这就是你交给厂商的证据。第三,验证结束后一定要用verifier /reset关闭验证,否则你的电脑会一直处于“慢动作审问”模式,性能大幅下降。如果用verifier验证后确认是某驱动的问题,最稳妥的解决方式就是卸载该驱动,换用上一版本或厂商修复后的版本。我处理的那批工作站,就是通过poolmon定位到网卡驱动的Tag持续增长,再用verifier实锤,最后换成该厂商在官网上提供的老版本驱动分支,连续观测72小时,非分页池一直稳定在1GB以内。4. 软件侧那些容易被忽略的内存钉子户:安全软件、反作弊、系统组件4.1 安全软件和游戏反作弊是内核池消耗大户排查完硬件的官方驱动,如果非分页池还在涨,下一个怀疑对象是第三方安全软件和游戏反作弊组件。这类软件和普通应用不同,它们为了监控文件读写、进程创建、注册表修改,会加载自己的内核过滤驱动。在一次杀毒扫描或一个反作弊检测过程中,这些驱动可能频繁申请内核内存做日志和缓冲。判断方法很简单:打开任务管理器看进程列表,把第三方安全软件的进程结束并重启系统。如果重启后非分页池的增长明显放缓,那就可以确定是安全软件的过滤驱动在干活。有些杀毒软件即使你退出主界面,内核驱动仍然在加载状态,所以必须重启才能验证。反作弊驱动的情况更隐蔽。某些游戏的反作弊组件会随着游戏启动而加载,退出游戏后内核驱动仍然驻留。如果你发现不玩游戏时内存正常,玩游戏后非分页池大幅上涨,重启才回落,那就把反作弊组件更新到最新版本,或者暂时卸载游戏主程序做对比试验。这里要提醒一句:Windows 11自带的防护组件在启用完整内存完整性(内核隔离)时,也会增加内核池的申请频率,但它是系统组件,通常经过充分测试,一般不会出现大规模泄漏。别一看到系统自带进程占用内存就急着禁用,很多“优化教程”靠这个误导用户,结果把系统主动防御关掉,换来几MB的“好看内存数字”,完全不值得。4.2 快速启动、休眠唤醒和内核池碎片我之前说过,Windows 11默认的快速启动会让“关机”变成“注销+保存内核会话”。如果你有睡眠唤醒、合盖开盖、频繁关机开机的习惯,一些驱动会在休眠保存和恢复时漏掉部分内存释放。这类问题有一个典型特征:非分页池的数值和开关机、唤醒次数强相关,每次唤醒涨几百MB,但不操作时则相对平稳。遇到这种情况,可以先尝试关闭快速启动。打开控制面板,进入“电源选项”,点击“选择电源按钮的功能”,再点击“更改当前不可用的设置”,把“启用快速启动”前面的勾去掉。对于依赖睡眠功能的笔记本,也可以单独用管理员命令行执行powercfg /h off来彻底关闭休眠。这会让你每次开机稍微慢几秒,但换来的是驱动状态更干净的加载路径,很多唤醒后内存飙升的问题会直接消失。顺带讲一个容易误判的地方:如果你看到内存里“已缓存(Cached)”特别高,别慌。这是Superfetch/SysMain服务在用空闲内存预加载常用程序,目的是让你下次打开程序更快。它占用的是“可用内存”而非“非分页池”,Windows在内存压力增大会自动回收。很多优化文章让用户禁用SysMain来“释放内存”,我实测下来,禁用后空闲内存确实多了几百MB,但程序冷启动明显变慢,属于得不偿失。记住:让非分页池失控的是内核驱动,让缓存变高的是SysMain预读,两者不要混为一谈。4.3 显卡驱动和系统组件的表观占用有一个场景十分常见:新买的Windows 11笔记本,什么都没开,任务管理器显示内存占用60%以上。点开详细信息,发现是“桌面窗口管理器”dwm.exe和“系统”进程占了几GB。这时候不要急着扣“内存泄漏”的帽子。dwm.exe高占用往往和显卡驱动相关,比如高刷新率屏幕、HDR模式、多显示器混合刷新率,都会让桌面合成器占用更多显存和共享内存。而“系统”进程那一大块非分页内存,有一部分其实是直接把显存映射到系统地址空间,在任务管理器的统计口径下,它会被算进非分页池。这种情况不是泄漏,是正常的硬件映射。判断标准还是那一条:数值会不会无限增长。dwm占2GB但稳定在2GB,和从2GB涨到8GB,完全是两码事。5. 能落地的内存占用修复方案:由浅到深,每步都可操作5.1 无风险前置操作:清理驱动残留、关闭快速启动、重置异常服务修复工作应该遵循由低风险到高风险原则。我先说两个几乎不会带来副作用的操作。第一个是把可疑的驱动彻底重装一遍,步骤是设备管理器里右键设备,“卸载设备”并勾选删除驱动软件,重启后去官网下载干净驱动。第二个是关闭快速启动,操作路径上文刚写过。如果你的系统网络模块因为驱动反复加载已经处于异常状态,还可以用管理员命令行执行网络栈重置:netsh winsock reset netsh int ip reset这两个命令会重置Winsock目录和TCP/IP协议栈,对网卡驱动残留状态导致的资源泄露,偶尔有奇效。执行完需要重启,重启后观察非分页池的曲线是否趋平。5.2 页面文件与虚拟内存设置的取舍很多人在内存不够时,第一反应是“禁掉页面文件来省空间”。这个操作在非分页池泄漏的场景下基本没有意义。你要知道:页面文件管的是可分页内存,非分页缓冲池不可分页,它不占用页面文件空间。你就算把页面文件全删了,该泄漏的非分页池还是照涨不误。但页面文件设置对另一类“内存占用高”是有意义的,比如已提交内存持续高位、运行大型程序时报错。如果你物理内存小于16GB,建议让系统自动管理所有驱动器的分页文件大小。如果物理内存大于32GB,也可以手动把C盘页面文件设成“系统托管”,把D盘等非系统盘页面文件设为“无分页文件”。不建议彻底禁用页面文件,原因是很多软件在代码里硬性检查可用虚拟内存大小,一旦发现为零会直接拒绝启动。5.3 关闭无关后台与计划任务,但要有边界干净启动是排查和修复并行的一种手段:Win+R输入msconfig,在“常规”选项卡勾选“有选择的启动”,取消“加载启动项”;再到“服务”选项卡里勾选“隐藏所有Microsoft服务”,然后全部禁用非系统服务,重启。这个状态下系统最干净,非分页池若仍然异常增长,说明泄漏源在系统基础驱动层;若恢复正常,则说明是某个第三方软件服务引起的。重启之后,逐一启用刚才禁用的服务,每启用一批就观察20分钟。这里要控制好边界:显卡驱动、声卡驱动、网卡驱动、芯片组相关的服务必须保持开启,不要把“干净启动”变成“裸奔系统”。我见过有人把音频服务禁用来省内存,结果声音没了,非分页池一点没降,纯属给自己添堵。5.4 DISM与SFC组合修复系统组件如果你已经定位到非分页池泄漏不完全是驱动问题,系统组件文件损坏也可能是一个诱因。Windows 11自身文件如果被破坏,某些系统驱动在加载时会反复申请内存并失败重试,导致池内存上涨。修复方法是用管理员命令行依次执行:DISM /Online /Cleanup-Image /RestoreHealth sfc /scannow第一条命令会连接系统更新源来修复系统镜像文件,可能需要15到30分钟,期间电脑会显得很卡,属于正常现象。执行完后再跑第二条,系统文件检查器会检查并修复损坏的系统文件。通常在执行完这两条命令后重启,能解决一部分莫名其妙的资源占用问题。需要提醒的是,这两个命令适合“已经排除了第三方驱动”的前提下使用。如果第三方驱动还挂在系统里,修复完系统文件,驱动一加载又回到老样子,那你等于白跑一遍。5.5 系统更新与补丁回滚Windows 11的累积更新有时本身就会引入非分页池泄漏问题。比如某个驱动厂商还没来得及适配新补丁,补丁改了内核接口,驱动调用的内存释放路径就断了。如果你发现故障是从某个“星期二补丁日”之后开始的,可以去“设置—Windows 更新—更新历史记录—卸载更新”,把最近的累积更新卸载掉,重启观察。判断是否应该回滚更新,我有两个经验标准:一是看这个更新是不是“安全补丁”之外的驱动更新或兼容性更新;二是在线搜一下这个KB编号和“非分页池/内存泄漏”关键字,如果反馈集中在特定硬件组合上,那大概率是适配问题。卸载更新不是让你从此不更新,而是把这个有问题的版本跳过去,等厂商发布修复后再更新。6. 收尾自查:确认非分页缓冲池不再“只增不减”的几个信号6.1 观测周期和监督基线排查工作最忌讳的是“重启之后内存正常了,就以为修复完了”。非分页池泄漏通常需要足够长的时间窗口才会重新冒头,所以修复后要定一个观测基线。我的做法是:修复完成后,记录修复前的池数值和修复后每次开机的池数值,连续48小时不关机,每隔6小时记录一次。如果修复前非分页池12小时涨了3GB,修复后48小时只涨了100到200MB而且会回落,那就算基本稳定。相反,如果48小时内又出现一次超过500MB的持续增长,说明驱动白卸载了,还得回头重新排查。另外,判断时别只看任务管理器那一个数字,因为任务管理器刷新有延迟且没有趋势线。靠谱的做法是用第2节建好的perfmon数据收集器集再跑一次,对比修复前后的曲线斜率。斜率归零,才算真修好了。6.2 用PowerShell脚本自动记录内存计数器手动记录太累,我一般会在排查对象的机器上挂一个小脚本,每5分钟写一行日志到CSV文件,跑一整天后拉出来看曲线。脚本很简单,不需要额外安装模块:$logPath = "$env:USERPROFILE\Desktop\pool-monitor.csv" "时间,NonPagedBytes,PagedBytes,AvailableMB,CommittedMB" | Out-File $logPath -Encoding UTF8 for ($i = 0; $i -lt 288; $i++) { $counters = Get-Counter ` -Counter "\Memory\Pool Nonpaged Bytes", ` "\Memory\Pool Paged Bytes", ` "\Memory\Available MBytes", ` "\Memory\Committed Bytes" ` -ErrorAction SilentlyContinue if ($counters) { $vals = $counters.CounterSamples | ForEach-Object { [math]::Round($_.CookedValue, 2) } $line = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss'),$($vals -join ',')" Add-Content $logPath $line } Start-Sleep -Seconds 300 }脚本默认跑24小时(288次采样),生成的文件用Excel打开,以时间为横轴做折线图,趋势一目了然。如果你只想跑半天,把循环次数改成144就行。6.3 当所有常规手段都定位不到时的兜底思路如果上述所有方法都试过了,非分页池还是莫名其妙地涨,我会做三件事。第一,去主板厂商官网看有没有新的固件更新,BIOS/UEFI里包含的微代码和固件驱动,偶尔会与Windows驱动产生资源管理冲突,更新固件后问题莫名消失的案例我碰到过多次。第二,把故障机器的完整配置信息连同dump文件发给驱动厂商技术支持,让他们分析驱动代码里的池释放路径。第三,实在不行就做一次“隔离式重装”,这不是无脑重装,而是先装完纯净系统不发问题,然后分批安装驱动和软件,每装一批就观察一段时间,用最原始但最可靠的方法锁定元凶。我在实际排查中最大的感受是:这类问题拼的不是高端技术,而是耐心和观察方法。很多人一上来就重装系统,结果装完两天又犯老毛病,真正高效的路线是先确认非分页池在涨,再通过poolmon看Tag,最后用驱动验证器实锤责任人。按这套流程走下来,Windows 11的内存疑难杂症大多都能在半天之内找到答案。
如果你手里的Windows 11电脑出现了这样一种症状:刚开机内存占用还算正常,用上几个小时之后“内存”曲线一路走高,任务管理器里“非分页缓冲池”从几百MB涨到好几个GB,系统开始卡顿、软件闪退,重启之后才能缓一阵子,那这篇就是给你准备的。我去年接手某公司一批工作站的性能排查,连续四台机器都是同样的毛病,第一反应是内存条坏了,换了两根内存条仍然复现,最后定位到是某个第三方网卡驱动在内核态反复申请非分页缓冲池却不释放。这类问题在Windows 11上出现的频率比很多人想象得高,而且表现往往藏得很深。这篇文章我会把排查思路和最终解决方案完整地写出来,包括你能直接抄作业的命令、工具和判断标准。1. 别急着换硬件:先搞懂非分页缓冲池为什么“只借不还”1.1 非分页缓冲池是内核的“固定工位”很多人第一次听到“非分页缓冲池”这个概念,是在任务管理器加上那一栏之后。说白了,非分页缓冲池(Non-Paged Pool)是Windows内核使用的一块特殊内存区域,它和普通用户程序占用的内存有个本质区别:里面的内存页不允许被换到磁盘上的页面文件里。内核为什么这么任性?因为很多底层代码运行在中断、延迟过程调用(DPC)或者驱动分发例程里,这些地方一旦触发缺页异常,整个系统就可能蓝屏。所以只要内核和驱动提出“我需要一块内存来干底层活”,系统就把物理内存直接划给它,不上锁不换页,随叫随到。为了方便理解,你可以把物理内存想象成一个写字楼。普通程序占用的是“可搬走的临时工位”,忙完了可以把资料搬到仓库(页面文件)去腾地方。而非分页缓冲池是“固定工位”,人必须一直坐在那里,因为有些紧急任务随时可能要找他,不能等你去仓库搬资料再回来。那么正常情况下这个“固定工位”应该有多少人?在Windows 11上,刚启动完成之后,非分页缓冲池一般只有几十MB到两三百MB;系统用了一段时间后,因为网络、存储、显卡等驱动都会申请和释放这个池,数值上下浮动几百MB是正常的。但如果它呈现单边上涨的趋势,比如每小时多几百MB,而且一路涨到几个GB也不回落,那就不是正常浮动了,而是内核态代码申请了内存之后忘记释放,这就是典型的非分页缓冲池泄漏。1.2 为什么Windows 11上这类泄漏特别容易冒出来我观察到一个现象:不少用户是升级到Windows 11之后才开始遇到这个问题的,同样的机器、同样的驱动,在旧系统上明明很安静。这不是错觉,主要有几个原因。首先是驱动老化与系统架构升级之间的矛盾。Windows 11对内核隔离、内存完整性(VBS/Memory Integrity)的支持力度明显加大,很多老驱动在新环境下加载路径变了,内存申请和释放的配对逻辑出现漏洞,表现为池内存只增不减。其次是现代硬件的驱动复杂程度远超过去。NVMe固态硬盘、Wi-Fi 6/7无线网卡、高刷屏幕、雷电接口,这些硬件在内核态处理大量I/O请求,每次I/O都可能申请非分页缓冲池。驱动写得不严谨,高频场景下漏一次内存申请是几乎发现不了的,但架不住每天成千上万次操作,漏着漏着系统就垮了。还有一个很容易被忽略的因素:快速启动和现代待机(Modern Standby)。Windows 11默认开启快速启动,关机实际上是“注销用户会话+保存内核休眠文件”,唤醒时内核和驱动要恢复状态。有些第三方驱动在休眠恢复过程中,只恢复了功能却没有恢复内存池状态,导致每一次开关机,非分页池就高出一截。这种泄漏不是开机时马上爆炸,而是一天下来数字越堆越高,重启后短暂回落,很多人误会成“电脑用久了就是会卡”。另外,第三方杀毒软件、游戏反作弊组件、云同步工具的内核过滤驱动,也都是非分页池的“大客户”。它们喜欢在文件读写、进程创建时切入系统内核,每切入一次就要分配内核内存。这些软件通常不会像系统驱动那样严格做内存回收测试,成了内存泄漏的温床。2. 四类工具交叉定位:任务管理器只能告诉你“满了”,要这样定位2.1 先从任务管理器和资源监视器建立基准排查的第一步永远是确认症状,而不是凭感觉。按下Ctrl+Shift+Esc打开任务管理器,切到“性能”页签,点“内存”,你会看到“非页面缓冲池”这一行。别急着下结论,先把数值记下来,连续观察30到60分钟。如果初始值是300MB,一小时后变800MB,两小时变1.5GB,这个增长轨迹就是泄漏的铁证。单纯看任务管理器仍有盲区,因为它只告诉你“有多少”,不告诉你“被谁占了”。所以紧接着打开资源监视器(Win+R输入resmon),看“内存”页签。这里有个常见误区:很多人看到“为硬件保留的内存”显示好几GB,就以为系统偷了内存。其实这部分是CPU和显卡预留的硬件地址空间,一般不参与软件分配,你不需要为它烦恼。真正值得关注的是“已提交”和“硬错误”两个指标。已提交内存是系统承诺给程序的内存总量,包含物理内存和页面文件;硬错误则代表程序访问的数据不在物理内存里,必须从磁盘读取。如果非分页池一直在涨,同时硬错误频繁,说明物理内存被内核占掉了太多,用户程序被迫大量换页,系统自然又慢又卡。2.2 性能监视器记录连续曲线:让数据替你说话资源监视器能看即时状态,但要想得到一份“案发现场”级别的趋势图,需要用到性能监视器(perfmon)。Win+R输入perfmon,展开“数据收集器集”,右键“自定义”新建一个数据收集器集,选择“手动创建”,加四个计数器:Memory\Pool Nonpaged Bytes(非分页池总量)Memory\Pool Paged Bytes(分页池总量)Memory\Available MBytes(可用内存)Memory\Committed Bytes(已提交内存)采样间隔我建议10到15秒一次,不要用默认的1秒,否则日志文件会膨胀得很快。让它跑一两个小时,然后打开报表,重点观察Pool Nonpaged Bytes曲线。如果曲线是持续爬升,中间很少回落,说明存在有规律的内核池申请;如果曲线像锯齿一样不断冲高又回落,那可能只是瞬时负载高,不是真正的泄漏。这一步能帮你分辨“内存占用高”和“非分页池泄漏”是不是同一个问题。很多时候,用户抱怨内存占用高,结果实际是高的是“缓存”或“已提交”,跟非分页池没关系。只有非分页池持续上涨才是内核态泄漏,其他的高占用问题解决方案完全不同。2.3 RAMMap快速筛出提交量和驱动锁定的内存判断完趋势,下一步是看“谁在占用”。RAMMap是一个单文件的绿色小工具,功能和任务管理器类似,但维度多得多。打开之后第一眼看“Use Counts”,里面有一个“Driver Locked”分类。这个分类表示被驱动锁定在物理内存里的页面,它和非分页池关系紧密。如果Driver Locked的数值高达好几GB,那基本可以断定内核驱动在大量锁内存。接着切到“Processes”页签,按“提交”列排序。正常排序前列应该是浏览器、开发工具、虚拟机这类大程序。如果排名第一的是一堆不明进程,或者某个驱动宿主进程异常高,那就要顺着这条线查下去。需要提醒的是,RAMMap界面上的“Empty”按钮可以清空工作集、系统工作集、备用列表等,操作之后内存占用数字会立刻降下来,网上很多人拿这个当“内存清理神器”。但你要明白:它只是让物理内存页面被释放归还,并不解决驱动申请不释放的根因。如果真有内核态泄漏,用完Empty之后,非分页池数值纹丝不动,过一会儿其他池又涨回去。所以RAMMap的正确用法是“快速分诊”,不是“治疗”。2.4 poolmon:抓泄露内核标签的核心工具真正能精准定位到“哪一类内核操作在泄漏”的,是poolmon工具。它是Windows驱动开发包里自带的调试小工具,体积不大,但威力很强。以管理员身份打开命令行,运行poolmon,界面上会刷出一堆标签(Tag)、类型(Type)、分配次数、释放次数和差值(Diff)。我习惯用poolmon /p /g组合参数:/p只显示非分页池,/g按增长量排序,这样正在暴涨的Tag会自己浮到最上面。怎么读结果?先让电脑闲下来,关掉大程序,然后让poolmon跑20分钟。重点看NonPaged类型的Diff列,哪个Tag的Diff值持续变大,哪个Tag就在泄漏。所谓Tag,是内核内存块的“身份证”,驱动申请内存时可以用4字符标签标记用途,比如网络相关的常见标签有NdIS、NmP,存储过滤驱动的有Fsd、File等。poolmon的问题在于,它告诉你Tag却不直接告诉你哪个驱动文件。这时候除了经验联想,还要配合两种手段:一是用WinDbg打开内核转储后执行!poolused 2命令,它按Tag分组并显示所属驱动;二是最笨但最有效的“实证隔离法”,只保留一个候选驱动运行,观察对应Tag是否还在涨,谁涨谁就是责任人。这套组合拳打下来,绝大多数泄漏源都跑不掉。3. 驱动排查是重头戏:从poolmon标签到驱动验证器的完整链路3.1 PoolTag到.sys的三种追踪姿势如果你的poolmon已经锁定了某个Tag,接下来要做的是把Tag翻译成具体的.sys文件。第一种方法是用WinDbg附加到系统或者分析dump文件,然后执行!poolused 2。这个命令会输出一个表格,每个Tag一行,最右边就是分配这个内存的模块名。看到模块名之后,在C:\Windows\System32\drivers目录里找同名文件,右键查看“详细信息”里的产品名和公司名,幕后黑手基本就浮出水面了。第二种方法是看驱动的加载顺序和依赖关系。Win+R输入driverquery /v,能看到所有内核驱动和服务。虽然不是所有泄漏Tag都能直接对上号,但把可疑Tag的常见归属整理成“嫌疑名单”,再辅助网络搜索该Tag对应的常见驱动,往往能缩小范围。第三种就是前面说的“实证隔离法”,也是我最推荐新手用的。因为poolmon和调试器对很多人来说门槛偏高,而隔离法不需要理解内核原理:先把系统进入干净启动状态(msconfig里禁用所有非必要服务),此时非分页池增长应该会明显放缓。然后手动加载一个驱动组,观察tag是否暴涨;再禁用一组,再加载另一组。这样两三轮下来,即使你不完全理解Tag含义,也能用排除法把泄漏驱动圈到只剩一两个。3.2 外围设备驱动排查清单和顺序根据我处理的案例,非分页池泄漏的高发驱动按概率排序是这样的:驱动类型内核态行为常见泄漏场景有线/无线网卡NDIS网络栈处理收发包高吞吐下载、休眠唤醒、Wi-Fi漫游显卡驱动WDDM模型提交显示命令游戏画面切换、多屏输出、视频硬件加速存储驱动NVMe/RAID命令处理磁盘连续大量读写、磁盘睡眠唤醒蓝牙驱动蓝牙协议栈资源分配蓝牙设备频繁断连重连安全软件过滤驱动监控文件与进程操作每次下载、每个新进程都要扫描一遍排查顺序建议从网络驱动开始,理由是NDIS驱动是内核态I/O最频繁的类型之一,而且很多第三方网卡驱动为了追求性能,习惯用自己的内存池来缓存数据包,写得不严谨非常容易漏释放。具体做法是打开设备管理器,找到网络适配器,右键卸载设备,注意勾选“删除此设备的驱动程序软件”,然后去硬件厂商官网下载当前芯片型号已知稳定的驱动版本,重新安装。别用第三方驱动管理工具一键更新,我见过太多“自动更新”把驱动换成错误分支的案例。如果是笔记本,蓝牙和无线网卡往往是同一个模块,建议同步更新。显卡驱动排查优先级排在第二位,特别是那些老核显驱动搭配新显卡驱动混装的情况,非常容易出现内核池冲突。这时需要用显卡驱动自带的干净安装模式,或者到设备管理器里先卸载显卡驱动,重启后重新安装完整驱动包。3.3 驱动验证器使用前必须知道的三件事当你通过poolmon锁定了某个驱动,但还想确认它确实是“凶手”时,可以用Windows自带的驱动验证器(verifier)做终极审判。以管理员身份打开命令行,执行:verifier /standard /driver 可疑驱动路径\可疑驱动.sys/standard是标准验证集合,会对内存申请长度、释放配对、DMA操作等做严格检查。然后重启电脑,系统会在加载该驱动时进行高强度压力测试,如果驱动真的有问题,通常会很快蓝屏,并生成转储文件,你可以用WinDbg分析到底哪行代码出了问题。但使用drv验证器前,有三件事必须提前知道。第一,千万不要一次性对所有驱动启用验证,否则开机极大概率直接卡死在加载阶段。我有个同事曾图省事直接verifier /standard全选,结果每一台测试机都进不了系统,最后只能进安全模式执行verifier /reset。第二,验证期间蓝屏是“预期行为”,不要慌张,蓝屏后重启进安全模式,去C:\Windows\Minidump把dmp文件保存好,这就是你交给厂商的证据。第三,验证结束后一定要用verifier /reset关闭验证,否则你的电脑会一直处于“慢动作审问”模式,性能大幅下降。如果用verifier验证后确认是某驱动的问题,最稳妥的解决方式就是卸载该驱动,换用上一版本或厂商修复后的版本。我处理的那批工作站,就是通过poolmon定位到网卡驱动的Tag持续增长,再用verifier实锤,最后换成该厂商在官网上提供的老版本驱动分支,连续观测72小时,非分页池一直稳定在1GB以内。4. 软件侧那些容易被忽略的内存钉子户:安全软件、反作弊、系统组件4.1 安全软件和游戏反作弊是内核池消耗大户排查完硬件的官方驱动,如果非分页池还在涨,下一个怀疑对象是第三方安全软件和游戏反作弊组件。这类软件和普通应用不同,它们为了监控文件读写、进程创建、注册表修改,会加载自己的内核过滤驱动。在一次杀毒扫描或一个反作弊检测过程中,这些驱动可能频繁申请内核内存做日志和缓冲。判断方法很简单:打开任务管理器看进程列表,把第三方安全软件的进程结束并重启系统。如果重启后非分页池的增长明显放缓,那就可以确定是安全软件的过滤驱动在干活。有些杀毒软件即使你退出主界面,内核驱动仍然在加载状态,所以必须重启才能验证。反作弊驱动的情况更隐蔽。某些游戏的反作弊组件会随着游戏启动而加载,退出游戏后内核驱动仍然驻留。如果你发现不玩游戏时内存正常,玩游戏后非分页池大幅上涨,重启才回落,那就把反作弊组件更新到最新版本,或者暂时卸载游戏主程序做对比试验。这里要提醒一句:Windows 11自带的防护组件在启用完整内存完整性(内核隔离)时,也会增加内核池的申请频率,但它是系统组件,通常经过充分测试,一般不会出现大规模泄漏。别一看到系统自带进程占用内存就急着禁用,很多“优化教程”靠这个误导用户,结果把系统主动防御关掉,换来几MB的“好看内存数字”,完全不值得。4.2 快速启动、休眠唤醒和内核池碎片我之前说过,Windows 11默认的快速启动会让“关机”变成“注销+保存内核会话”。如果你有睡眠唤醒、合盖开盖、频繁关机开机的习惯,一些驱动会在休眠保存和恢复时漏掉部分内存释放。这类问题有一个典型特征:非分页池的数值和开关机、唤醒次数强相关,每次唤醒涨几百MB,但不操作时则相对平稳。遇到这种情况,可以先尝试关闭快速启动。打开控制面板,进入“电源选项”,点击“选择电源按钮的功能”,再点击“更改当前不可用的设置”,把“启用快速启动”前面的勾去掉。对于依赖睡眠功能的笔记本,也可以单独用管理员命令行执行powercfg /h off来彻底关闭休眠。这会让你每次开机稍微慢几秒,但换来的是驱动状态更干净的加载路径,很多唤醒后内存飙升的问题会直接消失。顺带讲一个容易误判的地方:如果你看到内存里“已缓存(Cached)”特别高,别慌。这是Superfetch/SysMain服务在用空闲内存预加载常用程序,目的是让你下次打开程序更快。它占用的是“可用内存”而非“非分页池”,Windows在内存压力增大会自动回收。很多优化文章让用户禁用SysMain来“释放内存”,我实测下来,禁用后空闲内存确实多了几百MB,但程序冷启动明显变慢,属于得不偿失。记住:让非分页池失控的是内核驱动,让缓存变高的是SysMain预读,两者不要混为一谈。4.3 显卡驱动和系统组件的表观占用有一个场景十分常见:新买的Windows 11笔记本,什么都没开,任务管理器显示内存占用60%以上。点开详细信息,发现是“桌面窗口管理器”dwm.exe和“系统”进程占了几GB。这时候不要急着扣“内存泄漏”的帽子。dwm.exe高占用往往和显卡驱动相关,比如高刷新率屏幕、HDR模式、多显示器混合刷新率,都会让桌面合成器占用更多显存和共享内存。而“系统”进程那一大块非分页内存,有一部分其实是直接把显存映射到系统地址空间,在任务管理器的统计口径下,它会被算进非分页池。这种情况不是泄漏,是正常的硬件映射。判断标准还是那一条:数值会不会无限增长。dwm占2GB但稳定在2GB,和从2GB涨到8GB,完全是两码事。5. 能落地的内存占用修复方案:由浅到深,每步都可操作5.1 无风险前置操作:清理驱动残留、关闭快速启动、重置异常服务修复工作应该遵循由低风险到高风险原则。我先说两个几乎不会带来副作用的操作。第一个是把可疑的驱动彻底重装一遍,步骤是设备管理器里右键设备,“卸载设备”并勾选删除驱动软件,重启后去官网下载干净驱动。第二个是关闭快速启动,操作路径上文刚写过。如果你的系统网络模块因为驱动反复加载已经处于异常状态,还可以用管理员命令行执行网络栈重置:netsh winsock reset netsh int ip reset这两个命令会重置Winsock目录和TCP/IP协议栈,对网卡驱动残留状态导致的资源泄露,偶尔有奇效。执行完需要重启,重启后观察非分页池的曲线是否趋平。5.2 页面文件与虚拟内存设置的取舍很多人在内存不够时,第一反应是“禁掉页面文件来省空间”。这个操作在非分页池泄漏的场景下基本没有意义。你要知道:页面文件管的是可分页内存,非分页缓冲池不可分页,它不占用页面文件空间。你就算把页面文件全删了,该泄漏的非分页池还是照涨不误。但页面文件设置对另一类“内存占用高”是有意义的,比如已提交内存持续高位、运行大型程序时报错。如果你物理内存小于16GB,建议让系统自动管理所有驱动器的分页文件大小。如果物理内存大于32GB,也可以手动把C盘页面文件设成“系统托管”,把D盘等非系统盘页面文件设为“无分页文件”。不建议彻底禁用页面文件,原因是很多软件在代码里硬性检查可用虚拟内存大小,一旦发现为零会直接拒绝启动。5.3 关闭无关后台与计划任务,但要有边界干净启动是排查和修复并行的一种手段:Win+R输入msconfig,在“常规”选项卡勾选“有选择的启动”,取消“加载启动项”;再到“服务”选项卡里勾选“隐藏所有Microsoft服务”,然后全部禁用非系统服务,重启。这个状态下系统最干净,非分页池若仍然异常增长,说明泄漏源在系统基础驱动层;若恢复正常,则说明是某个第三方软件服务引起的。重启之后,逐一启用刚才禁用的服务,每启用一批就观察20分钟。这里要控制好边界:显卡驱动、声卡驱动、网卡驱动、芯片组相关的服务必须保持开启,不要把“干净启动”变成“裸奔系统”。我见过有人把音频服务禁用来省内存,结果声音没了,非分页池一点没降,纯属给自己添堵。5.4 DISM与SFC组合修复系统组件如果你已经定位到非分页池泄漏不完全是驱动问题,系统组件文件损坏也可能是一个诱因。Windows 11自身文件如果被破坏,某些系统驱动在加载时会反复申请内存并失败重试,导致池内存上涨。修复方法是用管理员命令行依次执行:DISM /Online /Cleanup-Image /RestoreHealth sfc /scannow第一条命令会连接系统更新源来修复系统镜像文件,可能需要15到30分钟,期间电脑会显得很卡,属于正常现象。执行完后再跑第二条,系统文件检查器会检查并修复损坏的系统文件。通常在执行完这两条命令后重启,能解决一部分莫名其妙的资源占用问题。需要提醒的是,这两个命令适合“已经排除了第三方驱动”的前提下使用。如果第三方驱动还挂在系统里,修复完系统文件,驱动一加载又回到老样子,那你等于白跑一遍。5.5 系统更新与补丁回滚Windows 11的累积更新有时本身就会引入非分页池泄漏问题。比如某个驱动厂商还没来得及适配新补丁,补丁改了内核接口,驱动调用的内存释放路径就断了。如果你发现故障是从某个“星期二补丁日”之后开始的,可以去“设置—Windows 更新—更新历史记录—卸载更新”,把最近的累积更新卸载掉,重启观察。判断是否应该回滚更新,我有两个经验标准:一是看这个更新是不是“安全补丁”之外的驱动更新或兼容性更新;二是在线搜一下这个KB编号和“非分页池/内存泄漏”关键字,如果反馈集中在特定硬件组合上,那大概率是适配问题。卸载更新不是让你从此不更新,而是把这个有问题的版本跳过去,等厂商发布修复后再更新。6. 收尾自查:确认非分页缓冲池不再“只增不减”的几个信号6.1 观测周期和监督基线排查工作最忌讳的是“重启之后内存正常了,就以为修复完了”。非分页池泄漏通常需要足够长的时间窗口才会重新冒头,所以修复后要定一个观测基线。我的做法是:修复完成后,记录修复前的池数值和修复后每次开机的池数值,连续48小时不关机,每隔6小时记录一次。如果修复前非分页池12小时涨了3GB,修复后48小时只涨了100到200MB而且会回落,那就算基本稳定。相反,如果48小时内又出现一次超过500MB的持续增长,说明驱动白卸载了,还得回头重新排查。另外,判断时别只看任务管理器那一个数字,因为任务管理器刷新有延迟且没有趋势线。靠谱的做法是用第2节建好的perfmon数据收集器集再跑一次,对比修复前后的曲线斜率。斜率归零,才算真修好了。6.2 用PowerShell脚本自动记录内存计数器手动记录太累,我一般会在排查对象的机器上挂一个小脚本,每5分钟写一行日志到CSV文件,跑一整天后拉出来看曲线。脚本很简单,不需要额外安装模块:$logPath = "$env:USERPROFILE\Desktop\pool-monitor.csv" "时间,NonPagedBytes,PagedBytes,AvailableMB,CommittedMB" | Out-File $logPath -Encoding UTF8 for ($i = 0; $i -lt 288; $i++) { $counters = Get-Counter ` -Counter "\Memory\Pool Nonpaged Bytes", ` "\Memory\Pool Paged Bytes", ` "\Memory\Available MBytes", ` "\Memory\Committed Bytes" ` -ErrorAction SilentlyContinue if ($counters) { $vals = $counters.CounterSamples | ForEach-Object { [math]::Round($_.CookedValue, 2) } $line = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss'),$($vals -join ',')" Add-Content $logPath $line } Start-Sleep -Seconds 300 }脚本默认跑24小时(288次采样),生成的文件用Excel打开,以时间为横轴做折线图,趋势一目了然。如果你只想跑半天,把循环次数改成144就行。6.3 当所有常规手段都定位不到时的兜底思路如果上述所有方法都试过了,非分页池还是莫名其妙地涨,我会做三件事。第一,去主板厂商官网看有没有新的固件更新,BIOS/UEFI里包含的微代码和固件驱动,偶尔会与Windows驱动产生资源管理冲突,更新固件后问题莫名消失的案例我碰到过多次。第二,把故障机器的完整配置信息连同dump文件发给驱动厂商技术支持,让他们分析驱动代码里的池释放路径。第三,实在不行就做一次“隔离式重装”,这不是无脑重装,而是先装完纯净系统不发问题,然后分批安装驱动和软件,每装一批就观察一段时间,用最原始但最可靠的方法锁定元凶。我在实际排查中最大的感受是:这类问题拼的不是高端技术,而是耐心和观察方法。很多人一上来就重装系统,结果装完两天又犯老毛病,真正高效的路线是先确认非分页池在涨,再通过poolmon看Tag,最后用驱动验证器实锤责任人。按这套流程走下来,Windows 11的内存疑难杂症大多都能在半天之内找到答案。