如何在远程计算机上分析C#应用程序的内存使用情况?
远程分析C#(.NET)应用内存使用的可行方案
问题背景
我开发的C#应用在客户现场内存占用每日增长约100MB,抓取转储文件后发现,总大小超过1GB的转储中仅约13MB由.NET可访问对象占用。尝试用Visual Studio的VSDiagnostics.exe在客户机上做运行时诊断,但复制工具后缺少内存分析所需的代理配置,无法正常使用。
以下是几种无需依赖Visual Studio完整安装的远程内存分析方案:
1. 使用.NET官方命令行诊断工具
这些工具属于.NET SDK生态,轻量且无需Visual Studio:
- dotnet-dump:可直接在客户机抓取并分析内存转储
- 在客户机部署工具:可通过
dotnet tool install --global dotnet-dump安装后,复制工具目录到客户机;或直接下载对应版本的独立工具包 - 抓取转储:执行命令
dotnet-dump collect -p <目标进程ID> - 本地分析:将生成的转储文件传回本地,用
dotnet-dump analyze <转储文件路径>启动分析会话,通过dumpheap、gcroot、eeheap等命令排查托管/非托管内存占用细节
- 在客户机部署工具:可通过
- dotnet-counters:实时监控内存关键指标,快速定位增长趋势
- 执行命令:
dotnet-counters monitor --process-id <进程ID> --counters System.Runtime,可查看GC堆大小、对象分配速率、垃圾回收次数等核心指标
- 执行命令:
2. 使用PerfView远程收集内存数据
PerfView是微软官方免费诊断工具,支持远程内存分析,操作步骤:
- 将
PerfView.exe复制到客户机(无需安装) - 在客户机启动PerfView,点击Collect -> Memory,配置收集选项(如勾选"GC Heap Allocation Sampling"、"Native Memory Tracking")
- 启动收集后,让应用运行一段时间,停止收集后将生成的
.etl文件传回本地 - 用本地的PerfView打开
.etl文件,分析内存分配热点、GC活动及非托管内存占用情况
3. 手动创建VSDiagnostics内存分析配置
若坚持使用VSDiagnostics.exe,可手动生成内存分析所需的代理配置文件:
- 参考现有配置(如
DotNetObjectAllocBase.json),创建DotNetMemoryBase.json文件,示例内容:
{ "Name": ".NET Memory Analysis", "Description": "Collects .NET memory usage and allocation data", "Providers": [ { "ProviderName": "Microsoft-Windows-DotNETRuntime", "Keywords": "0x1000", "Level": "Informational" }, { "ProviderName": "Microsoft-Windows-DotNETRuntimePrivate", "Keywords": "0x200", "Level": "Verbose" } ] }
- 将该配置文件与
VSDiagnostics.exe一同复制到客户机,执行命令启动诊断:VSDiagnostics.exe start <进程ID> /config:DotNetMemoryBase.json /output:memory_diag.etl - 收集完成后将
memory_diag.etl传回本地,用Visual Studio的诊断工具或PerfView打开分析
内容的提问来源于stack exchange,提问作者Dominique
相关产品推荐
相关产品推荐

