我一直在尝试识别应用程序中的内存泄漏。我制作了一个流程的转储文件,并一直用windbg查看它。当我这样做时:dumpheap -stat并总结内存的总使用量,总计为1.6GB。但是在创建转储时它自己使用的过程几乎是2.8GB。有人能告诉我我丢失的1.2GB在哪里吗?
答案 0 :(得分:4)
您是否运行了!address -summary
或!heap -s
?正如Brian指出的那样,!dumpheap
只关注托管帮助。
我强烈建议您从Microsoft获取调试诊断工具1.2或2.0。在“仅分析”模式下运行它,浏览到内存转储,填写崩溃/挂起和托管内存分析,然后运行它。分析非常有用,在我看来,比使用WinDbg更少痛苦。 (我已经使用了WinDbg超过10年。)
部分分析是非托管堆的列表。您可以在报告底部附近看到这些内容。寻找大的,看看它们分配了什么DLL。在过去,此报告帮助我快速识别在托管进程中分配了超过1 GB非托管空间的打印机驱动程序!
答案 1 :(得分:3)
!dumpheap
没有按照你的想法行事。它转储托管堆,托管堆只是.NET进程的一部分。例如。程序集中的代码(IL和JIT编译的代码)不存储在托管堆上。此外,本机程序集也会分配自己的内存,而这些内存也不会显示在托管堆上。因此,您永远不会看到托管堆的大小与进程的大小相匹配。没有一个地方可以查找剩余的内存使用情况。您可以通过使用vmmap获得一些额外的见解。