当前位置: 首页 > news >正文

利用 Perfmon.exe 与 UMDH 组合分析 Windows 程序内存消耗

在 Windows 性能调优与内存泄漏排查中,Perfmon.exe(性能监视器) 与 UMDH(User-Mode Dump Heap) 是两款非常强大的工具。Perfmon 能够实时监控系统资源使用情况,而 UMDH 能够深入分析进程的堆内存分配情况。将两者结合使用,可以高效定位内存异常并辅助生成分析数据。

本文将详细介绍 Perfmon 与 UMDH 的使用方法、组合流程,以及如何解析 UMDH 的差异快照文件 diff.txt,帮助开发者和运维人员更好地掌握 Windows 程序的内存行为。


一、Perfmon.exe 简介与使用方法

1.1 什么是 Perfmon?

Perfmon(性能监视器)是 Windows 自带的图形化工具,用于实时监控系统和进程的性能指标,包括 CPU、内存、磁盘、网络等。它支持设置警报、记录日志和触发操作,是系统性能分析的重要工具。

1.2 Perfmon 使用流程

步骤一:启动 Perfmon

在运行窗口中输入 perfmon 启动性能监视器。

步骤二:添加监视项

在左侧导航栏选择“性能监视器”,点击绿色加号,添加如下监视项:

  • Process → Private Bytes:进程私有内存大小
  • Process → Working Set:进程当前使用的物理内存
  • Memory → Available MBytes:系统剩余可用内存
  • Paging File → % Usage:页面文件使用率

选择目标进程名称,点击“添加”。

步骤三:设置数据收集器集

在“数据收集器集”中创建一个新的用户定义集,配置如下:

  • 类型:性能计数器
  • 采样间隔:例如 5 秒
  • 日志文件格式:CSV 或 Binary
步骤四:设置警报与触发器(可选)

可以设置当某项指标超过阈值时触发操作,例如:

  • 内存使用超过 1GB 时记录日志
  • CPU 使用率持续高于 80% 时发送通知

通过这些设置,可以实现对目标进程的持续监控,为后续内存分析提供数据依据。


二、UMDH 使用方法与 diff.txt 文件详解

2.1 什么是 UMDH?

UMDH 是 Windows Debugging Tools 中的一个命令行工具,用于分析用户模式进程的堆分配情况。它依赖于 gflags.exe 设置堆栈跟踪标志,并通过 umdh.exe 抓取堆快照,比较不同时间点的堆分配差异,从而定位内存泄漏。

2.2 UMDH 使用流程

步骤一:配置堆栈跟踪

使用 gflags.exe 设置目标进程的堆栈跟踪:

gflags.exe /i <YourApp.exe> +ust

这一步会启用用户堆栈跟踪功能,必须在程序启动前设置。

步骤二:启动目标程序

启动你要分析的程序,并让它运行一段时间,模拟正常使用场景。

步骤三:抓取堆快照

使用 umdh.exe 抓取堆快照:

umdh.exe -p:<PID> -f:snapshot1.txt

等待一段时间后再次抓取:

umdh.exe -p:<PID> -f:snapshot2.txt
步骤四:比较快照差异
umdh.exe snapshot2.txt snapshot1.txt > diff.txt

diff.txt 中将显示两次快照之间的堆分配差异,帮助定位内存泄漏点。


2.3 diff.txt 文件详解与示例解析

diff.txt 是 UMDH 的核心输出之一,它展示了两次堆快照之间的差异,主要用于识别内存泄漏或异常增长的堆分配。

文件结构概览

一个典型的 diff.txt 文件包含以下几个部分:

  1. 堆分配差异统计
  2. 调用堆栈信息
  3. 分配次数与字节数变化
  4. 模块路径与符号解析
示例片段解析
+ 0x000000000010000 bytes in 100 allocations
@ ntdll!RtlAllocateHeap+0x30
@ myapp!AllocateBuffer+0x120
@ myapp!ProcessData+0x40

解析说明:

  • + 表示内存增加(可能泄漏)
  • 0x10000 bytes 表示总共增加了 64KB 的堆内存
  • 100 allocations 表示分配了 100 次
  • 堆栈信息显示了调用链,最后一行通常是应用程序的业务逻辑函数
多个堆栈片段示例
+ 0x000000000002000 bytes in 20 allocations
@ kernel32!HeapAlloc+0x14
@ thirdparty.dll!CreateObject+0x88
@ myapp.exe!InitPlugin+0x2C+ 0x000000000000800 bytes in 8 allocations
@ msvcrt!malloc+0x10
@ myapp.exe!HandleRequest+0xA4

分析技巧:

  • 如果某个调用堆栈在 diff.txt 中持续出现,并且分配字节数不断增加,说明该路径可能存在内存泄漏。
  • 如果分配次数很多但字节数不大,可能是频繁的小对象分配,需结合业务逻辑判断是否合理。
  • 如果某个模块(如第三方库)频繁出现,建议检查其版本或使用方式是否正确。
快速定位泄漏路径

使用文本编辑器或命令行工具(如 findstr)搜索关键函数名:

findstr /i "AllocateBuffer" diff.txt

结合符号文件(PDB)与 WinDbg,可以进一步定位源代码行,确认泄漏位置。


三、UMDH 与 Perfmon 的组合使用场景

将 UMDH 与 Perfmon 结合使用,可以实现以下目标:

  • 实时监控内存使用趋势(Perfmon)
  • 定位内存泄漏点(UMDH)
  • 自动化分析流程(结合脚本或任务计划)

场景示例:定位内存泄漏

  1. 使用 Perfmon 设置监控目标进程的 Private Bytes。
  2. 当 Private Bytes 持续增长并超过阈值时,触发脚本执行:
    • 抓取 UMDH 快照
    • 比较差异并生成 diff.txt
  3. 使用 diff.txt 分析堆分配差异,结合符号文件定位源代码问题。

四、总结与建议

Perfmon 与 UMDH 是 Windows 平台上分析内存问题的黄金组合。Perfmon 提供实时监控与自动化触发机制,UMDH 提供堆级别的分配信息与差异分析。通过合理配置和组合使用,可以显著提升内存问题排查效率。

建议:

  • 在开发阶段就启用堆栈跟踪,便于后期分析。
  • 定期抓取堆快照,建立基线数据。
  • 使用 Perfmon 设置合理阈值,自动化触发分析流程。
  • 熟练掌握 diff.txt 的结构与含义,是定位内存泄漏的关键。

如果你在企业环境中负责 Windows 应用的运维或开发,掌握这套工具组合将极大提升你的问题定位与解决能力。欢迎留言交流你的使用经验或遇到的问题!

http://www.dtcms.com/a/395002.html

相关文章:

  • hello算法笔记 02
  • 二级域名解析与配置
  • 如何学习国库会计知识
  • 【读论文】压缩双梳光谱技术
  • Spark Structured Streaming端到端延迟优化实践指南
  • 【.NET实现输入法切换的多种方法解析】,第566篇
  • 性能测试-jmeter13-性能资源指标监控
  • 基于华为openEuler系统安装PDF查看器PdfDing
  • PyTorch 神经网络工具箱核心知识梳理
  • 【LangChain指南】Agents
  • Linux 的进程信号与中断的关系
  • IS-IS 协议中,是否在每个 L1/L2 设备上开启路由渗透
  • pycharm常用功能及快捷键
  • 滚珠导轨在半导体制造中如何实现高精度效率
  • 如何实现 5 μm 精度的视觉检测?不仅仅是相机的事
  • JavaScript学习笔记(六):运算符
  • Jenkins运维之路(制品上传)
  • 20届-高级开发(华为oD)-Java面经
  • 光流估计(可用于目标跟踪)
  • CANoe仿真报文CRC与Counter的完整实现指南:多种方法详解
  • sward入门到实战(4) - 如何编写Markdown文档
  • S32K146-LPUART+DMA方案实现
  • 【架构设计与优化】大模型多GPU协同方案:推理与微调场景下的硬件连接策略
  • 软件的安装python编程基础
  • Linux系统与运维
  • [Maven 基础课程]基于 IDEA 进行 Maven 构建
  • 一个基于 .NET 开源、简易、轻量级的进销存管理系统
  • 基于Flowlet的ARS(自适应路由切换)技术在RoCE网络负载均衡中的应用与优势
  • 计算机网络实验[番外篇]:MobaXterm连接Centos9的配置
  • Go语言实战案例-项目实战篇:实现一个词频分析系统