来自!dumpheap -stat的内存使用量不等于使用的总内存量

时间:2013-12-17 16:48:47

标签: .net memory-leaks windbg

我一直在尝试识别应用程序中的内存泄漏。我制作了一个流程的转储文件,并一直用windbg查看它。当我这样做时:dumpheap -stat并总结内存的总使用量,总计为1.6GB。但是在创建转储时它自己使用的过程几乎是2.8GB。有人能告诉我我丢失的1.2GB在哪里吗?

2 个答案:

答案 0 :(得分:4)

您是否运行了!address -summary!heap -s?正如Brian指出的那样,!dumpheap只关注托管帮助。

我强烈建议您从Microsoft获取调试诊断工具1.22.0。在“仅分析”模式下运行它,浏览到内存转储,填写崩溃/挂起和托管内存分析,然后运行它。分析非常有用,在我看来,比使用WinDbg更少痛苦。 (我已经使用了WinDbg超过10年。)

部分分析是非托管堆的列表。您可以在报告底部附近看到这些内容。寻找大的,看看它们分配了什么DLL。在过去,此报告帮助我快速识别在托管进程中分配了超过1 GB非托管空间的打印机驱动程序!

答案 1 :(得分:3)

!dumpheap没有按照你的想法行事。它转储托管堆,托管堆只是.NET进程的一部分。例如。程序集中的代码(IL和JIT编译的代码)不存储在托管堆上。此外,本机程序集也会分配自己的内存,而这些内存也不会显示在托管堆上。因此,您永远不会看到托管堆的大小与进程的大小相匹配。没有一个地方可以查找剩余的内存使用情况。您可以通过使用vmmap获得一些额外的见解。