c# - 为什么 !DumpHeap -stat 中的对象总和与 !EEHeap -gc 不匹配?

标签 c# .net windbg

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

相关文章:

c# - Entity Framework 日期组合查询

c# - 为 MySql 数据库运行 update-database 时出现错误 : Table 'xxx' doesn't exist

c# - 使用 Entity Framework 4 选择具有非标量键列表的多行的好方法

.net - 列表、数组或其他什么?

c# - .NET 转到 NuGet 包的实现

c++ - 如何在 Windbg 的析构函数中设置断点?

c# - 我如何分析 C# prodump 崩溃转储文件,异常来自 CLR?

c# - .Net Framework dll 不适用于 .Net Standard 项目

.net - 如何使用 WinDbg 在实例上查找自定义属性

Windows Server 2012 中的 C# 动态 COM