【问题标题】:Where is my memory going?我的记忆去哪儿了?
【发布时间】:2011-07-02 05:54:21
【问题描述】:

我们一直在使用 Vmmap、Processexplorer 和 MS Detours 来分析我们程序中的内存使用情况。 我们的目标是验证我们程序的内存使用情况。 例如,我们知道我们有 X MB 的数据从磁盘加载到内存中,我们希望确保我们不会以某种方式使用 2X MB 的内存来执行此操作。

但是,我们注意到以下差异: - 对于执行期间的特定点,Vmmap 将报告 ~1310 MB 的私有工作集,而 Processexplorer 将报告 ~1304 MB(仅减少 6MB,但哪个“更”准确......) - 使用 MS Detours 的内存跟踪将报告从 HeapAlloc 调用分配的 ~948 MB,但 Vmmap 会说程序正在使用 ~1143 MB 的私有堆

我的问题是, 除非我们的跟踪代码中出现错误,并且内存被驱动程序映射,任何人都可以解释 Vmmap 和 Processexplorer 如何能够比我们的 MS Detours 挂钩捕获更多的内存数据?

我们参与的其他值得注意的调用是: - 虚拟分配 - ZwAllocateVirtualMemory - RtlAllocateHeap - MapViewOfSection

非常感谢!

【问题讨论】:

  • 您知道这些指标的含义吗?如果对它们没有全面深入的了解,那么衡量就没有多大意义了。我知道我没有这样的理解。
  • @大卫:哦。应该更仔细地阅读。我要删除评论。感谢您的提示。
  • 有没有可能你的分配例程的钩子版本算对了?挂钩安装得够早吗?我的意思是在安装钩子之前分配了一些内存吗?我相信 Process Explorer 胜过几乎任何人都会写的任何东西 - Russinovich 真的很了解他的东西。
  • 在不知道如何以及何时获取数字的情况下准确比较数字是没有意义的。例如,用于 GC 内存的 .NET 性能计数器仅在 GC 之后更新。您的结果可能不同,因为 Process Explorer 和 VMMap 在更新其测量值时具有不同的触发器。

标签: windows winapi memory detours


【解决方案1】:

它会建议在特定时间进行内存转储并在 windbg 中打开它并执行 !address -summary。这个命令应该告诉你每个内存区域的状态。 如果它是一个 .NET 应用程序,那么您可能想要深入研究 GC 堆。您可以参考文章http://vpnchoudhary.blogspot.com/2011/03/out-of-memory-exception-simple.html了解更多详情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-29
    • 2010-11-01
    • 2016-03-24
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    相关资源
    最近更新 更多