排查内存泄漏关键看“涨不停、不回落”,需用PerfMon监控Private Bytes、Handle Count、Pool Nonpaged/Paged Bytes及.NET的# Bytes in all Heaps等计数器,结合长期采样与趋势分析定位泄漏类型。
排查内存泄漏,关键不是看谁“占得多”,而是看谁“涨不停、不回落”。性能监视器(perfmon)通过特定计数器的趋势变化,能比任务管理器更早、更准地暴露泄漏行为。
重点监控哪些计数器
打开 PerfMon(Win + R → perfmon),添加以下核心计数器:
- Process → Private Bytes:用户模式泄漏的黄金指标。它反映进程独占分配的内存总量(含虚拟内存),不受共享缓存干扰。持续单向上升且空闲后不回落,基本可确认泄漏。
- Process → Handle Count:句柄未释放常与内存泄漏伴生。若打开/关闭操作后句柄数只增不减,说明资源句柄(文件、窗口、事件等)未正确关闭。
- Memory → Pool Nonpaged Bytes 和 Pool Paged Bytes:内核模式泄漏的关键信号。若 Nonpaged 池持续上涨,同时 Available MBytes 不可逆下降,大概率是驱动或系统组件泄漏。
- .NET CLR Memory → # Bytes in all Heaps(仅限.NET应用):托管堆总内存。若该值与 Private Bytes 同步上涨,且 Gen 2 GC 频繁但内存不降,说明对象被强引用滞留。
设置有效的长期监控策略
内存泄漏往往是缓慢积累的过程,短时观察容易误判:
直播话术巡检系统(Windows版) — 实时语音转写、关键词检测、场景自动切换、告警推送、大屏可视化。支持 Windows VB-Cable 虚拟声卡音频采集,阿里云 ASR 实时识别。一键启动脚本,自动安装环境。
- 采样间隔建议:用户模式排查用 15–60 秒;内核池类问题需长时间观察,设为 600 秒(10 分钟)更稳妥。
- 总监控时长至少 30 分钟以上,覆盖应用启动→执行典型操作→进入空闲的全过程。
- 使用“数据收集器集”功能,将数据导出为 CSV 或 BLG 文件,便于后续用 Excel 绘图分析趋势,避免实时图表刷新丢失拐点。
- 监控期间尽量关闭其他大型程序,减少干扰变量,让趋势更干净。
识别泄漏的典型趋势特征
不是所有内存增长都危险,要抓住“反常性”:
- 重复执行相同操作(如打开/关闭一个窗口、刷新一次列表)后,Private Bytes 每次都比前一次更高,且空闲 5 分钟后仍无回落迹象。
- 进程已最小化或后台静默,但 Private Bytes 和 Handle Count 仍在缓慢爬升。
- Working Set 随 Private Bytes 扩大,而系统“可用内存”持续减少,“已提交内存”明显增加。
- 对 .NET 应用,# Bytes in all Heaps 与 Private Bytes 高度同步上涨,且对象实例数(如 .NET CLR Memory → # of Objects)只增不减。
确认泄漏后下一步做什么
PerfMon 能明确告诉你“哪个进程在泄漏”和“属于用户模式还是内核模式”,但不会指出具体哪行代码出问题:
- 若确认是用户模式泄漏(如 chrome.exe、yourapp.exe):后续可用 UMDH 工具抓取堆栈快照对比,定位到具体分配函数。
- 若确认是内核模式泄漏(Pool Nonpaged Bytes 异常上涨):配合 poolmon 查看高消耗 Tag,再用 driverquery /v 或 findstr 反查对应驱动。
- 对于 .NET 应用,可结合 ProcDump 在 Private Bytes 达到阈值时自动生成 dump,再用 WinDbg 或 dotMemory 分析对象图谱和根引用链。










