我正在WinDbg中查看完整的应用程序转储,并试图了解内存的消耗位置。

我已经解析了!DumpHeap -stat的输出,并汇总了此报告中的总内存,获得了约7 GB。相比之下,如果运行!EEHeap -gc,则报告的总大小约为11 GB。

为什么两个报告之间有如此大的差异?我如何知道另外4 GB的去向?

最佳答案

!eeheap的值是.NET分配的段大小的总和。

此值始终大于!dumpheap的输出总和。在某些情况下,差异很大,因为某些段中只有几个对象,例如固定对象,用于本地PInvoke或COM互操作内容。这样可以防止.NET释放这些段。您可以使用!gchandles检查固定的对象。

!eeheap的值与!address -summary报告的值进行交叉检查。假设您没有直接调用VitualAlloc()的本机代码,并且没有使用MSXML,则!eeheap的值应与此接近。

关于c# - 为什么!DumpHeap -stat中的对象总数不匹配!EEHeap -gc?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33375500/

10-11 15:34