我正在查看 WinDbg 中的完整应用程序转储,并试图了解我的内存在哪里被消耗。
我已经分析了 !DumpHeap -stat
的输出并总结了这份报告中的总内存,得到大约 7 GB。相比之下,如果我运行 !EEHeap -gc
,它会报告总共约 11 GB。
为什么两份报告会有如此大的差异?我如何才能找到额外的 4 GB 的去向?
最佳答案
!eeheap
的值是 .NET 分配的段大小的总和。
此值始终大于 !dumpheap
的输出总和。在某些情况下,它差异很大,因为在某些段中只有几个对象,例如固定对象,用于 native PInvoke 或 COM 互操作的东西。这可以防止 .NET 释放段。您可以使用 !gchandles
检查固定对象。
将 !eeheap
的值与 !address -summary
报告的 VitualAlloc()
的 native 代码并且您不使用 MSXML,则 !eeheap
的值应该接近于此。
关于c# - 为什么 !DumpHeap -stat 中的对象总和与 !EEHeap -gc 不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33375500/