『内存泄露』在生产环境中,.Net如何定位系统内存泄露具体位置

举报
老陈聊架构 发表于 2022/07/26 21:45:03 2022/07/26
【摘要】 📣读完这篇文章里你能收获到 - 生产环境排查内存问题的工具 - 排查命令的使用 - 排查经验分享

请添加图片描述
📣读完这篇文章里你能收获到

  • 生产环境排查内存问题的工具
  • 排查命令的使用
  • 排查经验分享

请添加图片描述

一、前提条件

  • 定位环境:生产环境

  • .NET Core 3.1 SDK 或更高版本。

  • dotnet-counters 检查托管内存的使用情况。

  • dotnet-dump 收集和分析转储文件。

请添加图片描述

二、排查步骤

1. 项目准备

  1. 创建内存溢出的项目

2. dotnet-counters准备

  1. 先安装dotnet-counters

    dotnet tool install --global dotnet-counters
    在这里插入图片描述

  2. 然后找到进程编号

    dotnet-counters ps
    在这里插入图片描述

  3. 然后监视进程

    dotnet-counters monitor --refresh-interval 1 -p 10232 (进程编号)
    在这里插入图片描述

  4. 最后查看显示统计信息

    找到 GC Heap Size 。然后统计这个程序的增长,为了找出内存泄露的代码
    在这里插入图片描述
    在这里插入图片描述

3. dotnet-dump准备

  1. 先安装dotnet-counters

    dotnet tool install --global dotnet-dump
    在这里插入图片描述

  2. 然后生成转储文件(内存文件)

    dotnet-dump collect -p 10232 (进程编号)
    在这里插入图片描述

  3. 然后分析转储文件

    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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。