『内存泄露』在生产环境中,.Net如何定位系统内存泄露具体位置
【摘要】 📣读完这篇文章里你能收获到
- 生产环境排查内存问题的工具
- 排查命令的使用
- 排查经验分享
📣读完这篇文章里你能收获到
- 生产环境排查内存问题的工具
- 排查命令的使用
- 排查经验分享
一、前提条件
-
定位环境:生产环境
-
.NET Core 3.1 SDK 或更高版本。
-
dotnet-counters 检查托管内存的使用情况。
-
dotnet-dump 收集和分析转储文件。
二、排查步骤
1. 项目准备
- 创建内存溢出的项目
2. dotnet-counters准备
-
先安装dotnet-counters
dotnet tool install --global dotnet-counters
-
然后找到进程编号
dotnet-counters ps
-
然后监视进程
dotnet-counters monitor --refresh-interval 1 -p 10232 (进程编号)
-
最后查看显示统计信息
找到 GC Heap Size 。然后统计这个程序的增长,为了找出内存泄露的代码
3. dotnet-dump准备
-
先安装dotnet-counters
dotnet tool install --global dotnet-dump
-
然后生成转储文件(内存文件)
dotnet-dump collect -p 10232 (进程编号)
-
然后分析转储文件
dotnet-dump analyze dump_20210825_225811.dmp(转储文件名)
三、结果分析
1. 找到内存比较大的类型,通过查看内存占用大小和对象数量
dumpheap -stat
直接拉到最下面,看最大的对象
2. 然后分析类型具体对象
dumpheap -mt 00007ffe88612360
为类型编号
3. 然后找出的应用根(目的是找出在哪里被引用了)
gcroot -all 000002c054600480
对象编号
随便找一个引用,以最后一个来看
到这一步已经可以排查出是Employee里边导致的,接着排查代码
这里数据没能GC回收是由于对象的运行时间比析构队列的长导致GC无法回收,实际上可能有其他稀奇古怪的各种原因,定位到代码以后剩下的都好排查了
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)