生产环境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实例数等,并将其作为自定义属性加入遥测:
随后在Program.cs中注册: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(); } } }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
相关产品推荐
相关产品推荐

