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

生产环境ASP.NET Core 6站点内存占用分析及存储数据排查

记录ASP.NET Core 6应用内存数据的方法

一、利用.NET原生诊断工具

  • 捕获内存转储分析:在服务器上执行命令 dotnet-dump collect -p <应用进程ID>,生成内存转储文件后,可通过 dotnet-dump analyze 命令直接分析,或导入Visual Studio、WinDbg工具查看对象分布、高内存占用类型等细节。
  • 实时监控内存细分指标:在Program.cs中添加日志配置启用EventCounter:
    builder.Services.AddLogging(loggingBuilder =>
    {
        loggingBuilder.AddEventSourceLogger();
    });
    
    再执行 dotnet-counters monitor --process-id <应用进程ID> System.Runtime,实时查看GC堆大小、对象分配速率、代龄内存占比等细分数据。

二、扩展Application Insights的内存追踪能力

  • 自定义内存遥采集:编写自定义遥测初始化器,定期收集应用内关键数据结构的状态,比如缓存对象数量、DbContext实例数等,并将其作为自定义属性加入遥测:
    public class MemoryDetailTelemetryInitializer : ITelemetryInitializer
    {
        private readonly IMemoryCache _cache;
    
        public MemoryDetailTelemetryInitializer(IMemoryCache cache)
        {
            _cache = cache;
        }
    
        public void Initialize(ITelemetry telemetry)
        {
            if (telemetry is RequestTelemetry requestTelemetry)
            {
                requestTelemetry.Properties["CachedItemCount"] = _cache.Count.ToString();
                requestTelemetry.Properties["GCHeapMemoryMB"] = (GC.GetTotalMemory(false) / 1024 / 1024).ToString();
            }
        }
    }
    
    随后在Program.cs中注册:builder.Services.AddSingleton<ITelemetryInitializer, MemoryDetailTelemetryInitializer>();
  • 开启快照调试器:在Azure门户的Application Insights中启用Snapshot Debugger,当触发OutOfMemoryException时自动捕获内存快照,可在门户内查看对象引用链、内存占用Top对象详情。

三、代码层手动记录内存数据

  • 关键对象内存占用日志:使用GC.GetTotalMemory(false)获取当前GC堆内存总量,结合第三方工具(如ObjectSizeCalculator)估算业务对象的内存大小,将这些信息写入应用日志。
  • GC回收事件追踪:注册GC通知回调,在GC完成后记录回收内存量、代龄等信息:
    GC.RegisterForFullGCNotification(10, 10);
    _ = Task.Run(async () =>
    {
        while (true)
        {
            var status = GC.WaitForFullGCApproach();
            if (status == GCNotificationStatus.Succeeded)
            {
                // 记录即将触发Full GC的日志
                Logger.LogWarning("Full GC is approaching, current GC heap: {Size}MB", GC.GetTotalMemory(false)/1024/1024);
            }
            await Task.Delay(1000);
        }
    });
    

四、容器化环境补充方案(若适用)

如果应用部署在容器中,可配置容器内存限制监控,同时部署dotnet-monitor工具,通过HTTP接口实时拉取应用内存指标,或设置自动触发OutOfMemoryException时的内存转储捕获。


内容的提问来源于stack exchange,提问作者Mathias Rönnlund

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 06:40:19