我正在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/