zoukankan      html  css  js  c++  java
  • 程序内存使用高,问题诊断方法

    背景

    线上有个程序,任务管理器中看到占用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  
  • 相关阅读:
    第11组(73) 需求分析报告
    第11组(73)团队展示
    结对编程作业
    第02组 Alpha冲刺 总结
    第02组 Alpha冲刺 (6/6)
    第02组 Alpha冲刺 (5/6)
    第02组 Alpha冲刺 (4/6)
    第02组 Alpha冲刺 (3/6)
    第02组 Alpha冲刺 (2/6)
    第02组 Alpha冲刺 (1/6)
  • 原文地址:https://www.cnblogs.com/liuqiyun/p/15507881.html
Copyright © 2011-2022 走看看