如何像Visual Studio调试诊断工具一样获取进程方法的最大内存占用
获取.NET程序的最大内存占用(峰值内存)
一、BenchmarkDotNet场景下的解决方案
BenchmarkDotNet自带的MemoryDiagnoser仅统计总分配内存量,若要获取内存峰值,可通过以下两种方式实现:
1. 用Process类监控自身进程
在Benchmark的生命周期方法中,周期性采集当前进程的内存数据并记录最大值:
using BenchmarkDotNet.Attributes; using System.Diagnostics; [MemoryDiagnoser] public class MemoryBenchmark { private Process _currentProcess; private long _maxMemory; [GlobalSetup] public void Setup() { _currentProcess = Process.GetCurrentProcess(); _maxMemory = 0; } [Benchmark] public void TargetMethod() { // 替换为你的测试逻辑 for (int i = 0; i < 10000; i++) { var buffer = new byte[1024 * 1024]; // 实时刷新并更新峰值 _currentProcess.Refresh(); _maxMemory = Math.Max(_maxMemory, _currentProcess.PrivateMemorySize64); } } [GlobalCleanup] public void Cleanup() { Console.WriteLine($"峰值内存占用: {(_maxMemory / 1024.0 / 1024.0):F2} MB"); } }
- 内存指标说明:
PrivateMemorySize64:进程私有内存大小,更贴近程序自身的内存占用WorkingSet64:进程当前使用的物理内存(对应Visual Studio中的工作集)PagedMemorySize64:包含磁盘交换区的分页内存
2. 结合PerfViewDiagnoser
通过BenchmarkDotNet的PerfViewDiagnoser扩展,借助PerfView工具获取更精准的内存峰值数据:
- 安装PerfView工具
- 在Benchmark类上添加
[PerfViewDiagnoser]特性 - 运行基准测试后,生成的报告中会包含内存峰值等详细性能数据
二、外部进程监控的优化方案
你提供的Chrome监控代码可行,可通过以下优化提升实用性:
using System; using System.Diagnostics; using System.Threading; class Program { public static void Main(string[] args) { using (Process process = new Process()) { process.StartInfo.FileName = @"C:\Program Files\Google\Chrome\Application\chrome.exe"; long maxMemoryUsage = 0; try { process.Start(); while (!process.HasExited) { process.Refresh(); // 选择对应内存指标 long currentMemory = process.PrivateMemorySize64; maxMemoryUsage = Math.Max(maxMemoryUsage, currentMemory); Thread.Sleep(100); // 降低循环频率,减少CPU占用 } Console.WriteLine($"最大内存占用: {(maxMemoryUsage / 1024.0 / 1024.0):F2} MB"); } catch (Exception ex) { Console.WriteLine($"监控异常: {ex.Message}"); } Console.ReadLine(); } } }
- 核心优化:增加
Thread.Sleep降低CPU消耗,添加异常处理覆盖进程启动失败、中途崩溃等场景
三、Visual Studio诊断工具补充
Visual Studio调试诊断工具的内存图表,是通过ETW事件实时采集进程内存数据。若需精准分析峰值,可打开「调试 > 显示诊断工具 > 内存使用」面板,它会自动记录内存波动曲线,标注峰值点,还支持导出数据进行后续分析。
内容的提问来源于stack exchange,提问作者Wei Lin
相关产品推荐
相关产品推荐

