You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何像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工具获取更精准的内存峰值数据:

  1. 安装PerfView工具
  2. 在Benchmark类上添加[PerfViewDiagnoser]特性
  3. 运行基准测试后,生成的报告中会包含内存峰值等详细性能数据

二、外部进程监控的优化方案

你提供的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 05:50:26