程序内存使用高,问题诊断方法
背景
线上有个程序,任务管理器中看到占用2个多G内存,问题怎么排查呢?
工具
模拟内存泄漏
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