现象
随着程序运行,内存占用率越来越高,直到触发linux的OOM,程序被杀死。
1.工具安装
.netcore安装这里就不叙述
分析工具:dotnet-counters, dotnet-dump
转储收集和分析实用工具 (dotnet-dump)
dotnet tool install --global dotnet-dump
调查性能计数器 (dotnet-counters)
dotnet tool install --global dotnet-counters
工具的安装见:https://docs.microsoft.com/zh-cn/dotnet/core/diagnostics/dotnet-counters
分析过程
1.获取要分析进程的pid
任务管理器-->详细信息-->找到你程序的PID:比如18924
2,查看内存使用情况(我这里pid为18924)
dotnet-counters monitor -p 18924
从结果来看,GC中的Gen2占用了较多的内存,理论上,不应该有很多的Gen2,我们需要分析一下Gen2里面到底是什么?
Gen0,Gen1,Gen2以及LOH的区别,以及.net core内存管理机制,见:
Memory management and patterns in ASP.NET Core | Microsoft Learn
3,获取进程的dump文件
新开个cmd 运行如下命令
dotnet-dump collect -p 18924
说明:要使用这条命令获取dump,如果在docker中,需要提供docker的--private参数,如果是在AWS的ECS中使用的Fargate模式运行,则不支持此参数。需要在EC2上运行
此命令会在当前目录生成一个dump文件。
4,分析dump文件
dotnet-dump analyze dump_20240223_091017.dmp
# 分析gen2中的内容,每个命令的参数以及和含义,可以使用help查看
然后在执行如下命令
dg gen2
从结果来看,有很多string类型的数据在gen2中,以及mysql的一些数据,我们打开看看具体是什么内容,执行如下命令
格式如: dumpheap -mt上图的的一串代码
dumpheap -mt 00007ffe7b2069b8
接下来 我们分析最后一个
再执行do命令查看该string在哪个位置产生的
do 01fffd711038
结果如图依次类推 查其他的情况