内核内存泄漏需通过PerfMon持续监控非分页池、分页池和可用内存三指标联动趋势来识别:若Pool Nonpaged Bytes持续上涨不回落、Pool Paged Bytes同步增长、Available MBytes单向不可逆下降,即为典型泄漏信号。
直接用性能监视器(perfmon)查内核内存泄漏,关键不是看“谁占得多”,而是看“谁涨得停不下来”。内核级泄漏通常藏在非分页池、分页池和可用内存的联动变化里,任务管理器完全看不到趋势,必须靠持续采样和指标交叉比对。
盯紧三个核心计数器
打开 PerfMon(Win+R → 输入 perfmon),添加以下三项,缺一不可:
- \Memory\Pool Nonpaged Bytes:非分页缓冲池用量。这是最危险的指标——它占用的是必须常驻物理内存的区域。正常空闲服务器一般低于 500MB;若几小时内持续上涨超 300MB 且不回落,基本锁定为驱动或系统服务泄漏。
- \Memory\Pool Paged Bytes:分页缓冲池用量。WMI、某些反病毒驱动、远程桌面服务等容易在这里堆积。配合 Nonpaged 观察是否同步增长,可初步判断泄漏是否涉及多层内核组件。
- \Memory\Available MBytes:可用物理内存。它不会剧烈波动,但应呈现缓慢、单向、不可逆的下降趋势。若该值从 4000MB 持续掉到 800MB 并卡住,同时 Nonpaged 池同步涨了 1.2GB,就是典型内核泄漏信号。
设置合理采集策略
采样太密会拖慢系统,太疏会漏掉拐点。推荐配置:
- 采样间隔设为 600 秒(10 分钟),连续记录至少 8–24 小时——短于 8 小时很难区分是缓存抖动还是真实泄漏。
- 日志格式选 二进制循环日志(Binary Circular),避免磁盘被撑爆;缓冲区大小保持默认 400MB 即可。
- 不要只加一个计数器。必须三者同图对比:当 Available MBytes 下滑,而 Pool Nonpaged Bytes 同步上扬,中间几乎没有平台期或回落,这就是泄漏的“呼吸曲线”。
定位泄漏驱动用 PoolMon 配合验证
PerfMon 确认泄漏存在后,下一步是找具体驱动。此时需切换工具:
- 以管理员身份运行命令提示符,执行 poolmon -d(按 D 切换按非分页池排序),观察顶部标签(Tag)的 “Nonp” 列是否持续增大。
- 记下最大消耗的 2–3 个 Tag(如 Leak、ndis、Netw),再用 findstr /i "Leak" C:\Windows\inf\*.inf 或 driverquery /v | findstr /i "Leak" 反查对应驱动名。
- 特别注意 WMI 相关进程:若 svchost.exe (Winmgmt) 的 Private Bytes 和 Pool Paged 同步飙升,且重启 WMI 服务后缓解数小时又复发,大概率是第三方 WMI 提供程序泄漏,可临时运行 sc config winmgmt type= own 隔离排查。
补一手:事件日志交叉印证
系统日志(Event Viewer → Windows Logs → System)中若频繁出现:
- Event ID 2004(资源耗尽检测),描述中列出高提交量进程,但实际问题不在用户态——这时要回头检查 Pool Nonpaged 是否同期异常;
- Event ID 29(内核内存不足警告)或 Event ID 41(意外关机),若时间点与 PerfMon 中 Nonpaged 峰值吻合,基本可排除硬件故障,直指驱动泄漏。
PerfMon 不是万能锤,但它是最可靠的“泄漏听诊器”。看清趋势、守住三指标、配合 PoolMon 查标签,内核泄漏就藏不住。











