打赏

程序内存使用高,问题诊断方法

背景

线上有个程序,任务管理器中看到占用2个多G内存,问题怎么排查呢?

工具

下载procdump,下载WinDbg

模拟内存泄漏

    class Program
    {
        static void Main(string[] args)
        {
            List<string> list = new List<string>();

            for (int i = 0; i < int.MaxValue; i++)
            {
                list.Add(string.Join(",", Enumerable.Range(0, 10000)));
            }

            Console.ReadLine();
        }
    }

将程序跑起来后,设置 procdump 在内存超过 1G 的时候自动抓取全内存 dump,使用如下命令.

procdump  ConsoleApp2 -m 1024 -ma C:\Users\PC-SDWQ\source\repos\ConsoleApp1

生成了 dump 文件,接下来用 windbg 看一看

寻找大对象,在托管堆中使用 !dumpheap -stat -min 1024 即可

!dumpheap -stat -min 1024 

 

 

 

 

 

从输出的最后一行可以看出,System.String 有1w多个,接下来可以增加  -type 属性筛选出 >10k 的字符串。

!dumpheap -type System.String -min 10240

 

 

 从最后的 !gcroot 看,确实是被 Program.cs:18 行的 List 所持有,到此水落石出。

!gcroot 00000207b8d40a50

  

 

 

 

 总结:

!dumpheap -stat -min 1024   寻找大对象
!dumpheap -type System.String -min 10240  筛选出 >10k 的大对象
!gcroot 00000207b8d40a50  

 

posted @ 2021-11-04 13:56  刘奇云  阅读(219)  评论(0编辑  收藏  举报