本文介绍: 不难看出,这是一个故意写成内存泄漏例子,其中创建一个字典dict,键为整数,值也为整数,不断创建对象放入字典中,内存会不断增长,最终崩溃可以看到,已经精准定位字典问题,因为代码我们写的,这个字典在哪里进行调用,我们自己很清楚,于是就有了排查方向。最近我们的项目出现了内存激增的情况,初次探讨,我们发现机器人发生通信之后,内存会缓慢上升,直到系统崩溃。8.还是太多,不过已经能看出是一个Int32数组问题,我们还可以继续过滤其他的,选择代码中的大型对象。3.勾选内存使用率项,然后开始检测

背景

最近我们的项目出现了内存激增的情况,初次探讨,我们发现机器人发生通信之后,内存会缓慢上升,直到系统崩溃

例子

由于只是介绍一个简单方案,所以就写一个比较简单例子演示了,代码如下

internal class Program
{
    static void Main(string[] args)
    {
        Dictionary&lt;int, List<int&gt;&gt; dict = new Dictionary<int, List<int&gt;&gt;();
        for(int i = 0; i < 100000000; i++)
        {
            dict[i]=new List<int&gt;();
            for(int j = 0; j < 100000000; j++)
            {
                dict[i].Add(j);
            }
            Console.WriteLine($"dict[{i}].Count={dict[i].Count}");
        }
        Console.WriteLine($"dict.Count={dict.Count}");
    }
}

不难看出,这是一个故意写成内存泄漏例子,其中创建一个字典dict,键为整数,值也为整数,不断创建对象放入字典中,内存会不断增长,最终崩溃

调试

1.打开vs2022,把项目启动方式改为Release

2.选择“调试-&gt;性能探测器”

3.勾选内存使用率项,然后开始检测

4.检测过程中,我们可以对当前内存中各对象占用情况进行多次抓拍

5.抓拍了差不多的时候,就可以停止收集,开始分析

 

 6.如上,我们选择最后一个抓拍的结果点击查看

7.东西有点多,是不是看不懂,没关系,选择显示对象,因为内存泄漏很多情况都是因为死对象没得到释放造成的。

8.还是太多,不过已经能看出是一个Int32数组问题,我们还可以继续过滤其他的,选择代码中的大型对象。

9.点击最终锁定的Int32[],会看到调用情况

10. C#中List底层就是个数组来维护的,点击List<int&gt;继续展开

可以看到,已经精准定位到字典的问题,因为代码是我们写的,这个字典在哪里进行调用,我们自己很清楚,于是就有了排查方向。 

原文地址:https://blog.csdn.net/qq_36694133/article/details/134703315

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_39558.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注