【问题标题】:Memory usage from !dumpheap -stat does not equal total memory used!dumpheap -stat 的内存使用量不等于使用的总内存
【发布时间】:2013-12-17 16:48:46
【问题描述】:

我一直在尝试识别我的应用程序中的内存泄漏。我制作了该过程的转储文件,并一直在用windbg查看它。当我执行 !dumpheap -stat 并总结内存的总使用量时,它总计为 1.6GB。但是创建转储时它自己使用的进程几乎是 2.8GB。谁能告诉我丢失的 1.2GB 在哪里?

【问题讨论】:

  • 你是否使用任务管理器来测量内存?如果是,那就不要。
  • @Blam 好的。为什么这是衡量内存的不好方法?
  • 不准确。需要一个内存分析器。
  • 会的。我会回来更新问题。
  • @slinzerthegod 还使用VMMap 工具来查看整体内存使用情况,例如,您可以拥有相当多的非托管内存。

标签: .net memory-leaks windbg


【解决方案1】:

您是否运行过!address -summary!heap -s?正如 Brian 指出的那样,!dumpheap 只查看托管帮助。

我强烈建议从 Microsoft 获取调试诊断工具 1.22.0。在仅分析模式下运行它,浏览到您的内存转储,填写崩溃/挂起和托管内存分析,然后运行它。该分析非常有用,在我看来,它比使用 WinDbg 更痛苦。 (我断断续续地使用 WinDbg 超过 10 年。)

部分分析是非托管堆的列表。您可以在报告底部附近看到这些。寻找大的,看看是什么 DLL 分配了它们。过去,此报告帮助我快速识别在托管进程中分配了超过 1 GB 非托管空间的打印机驱动程序!

【讨论】:

    【解决方案2】:

    !dumpheap 不会像你想的那样做。它转储托管堆,这只是 .NET 进程的一部分。例如。程序集中的代码(IL 和 JIT 编译的代码)不存储在托管堆上。此外,本机程序集分配自己的内存,这些内存也不显示在托管堆上。因此,您永远不会看到托管堆的大小与进程的大小匹配。没有一个地方可以查找剩余内存使用情况。通过使用 vmmap,您可能会获得一些额外的见解。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-11
      • 2020-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多