7

我有一个长期运行的实验程序的内存猪,我想知道它的实际内存占用。任务管理器说(在 windows7-64 中)该应用程序正在消耗 800 mb 的内存,但根据任务管理器的说法,分配的内存总量为 3.7gb。所有分配内存的总和不等于 3.7gb。我如何动态确定我的应用程序实际消耗了多少内存。

推论:任务管理器实际报告的内存是多少?它似乎并不是分配给应用程序本身的所有内存。

4

4 回答 4

2

据我了解,任务管理器显示工作集;

工作集:进程线程最近接触的内存页集。如果计算机中的可用内存高于阈值,则页面将留在进程的工作集中,即使它们没有被使用。当可用内存低于阈值时,将从工作集中修剪页面。

通过http://msdn.microsoft.com/en-us/library/cc432779(PROT.10).aspx

您也可以让任务管理器显示虚拟内存。

我通常使用 perfmon (Start -> Run... -> perfmon) 来跟踪内存使用情况,使用 Private Bytes 计数器。它反映了正常分配器(new/HeapAlloc/malloc 等)分配的内存。

于 2009-07-22T16:47:10.643 回答
2

记忆是一件很难衡量的事情。应用程序可能会保留大量虚拟内存,但实际上并没有使用太多。一些内存可能是共享的;也就是说,一个共享 DLL 可能会被加载到多个应用程序的地址空间中,但它只会被加载到物理内存中一次。

一个很好的衡量标准是工作集,它是其虚拟地址空间中最近访问过的页面集。“最近访问”的含义取决于操作系统及其页面替换算法。换句话说,它是映射到物理内存并正在使用的实际虚拟页面集。这是任务管理器向您显示的内容。

虚拟内存使用量是已保留的虚拟页面的数量(请注意,并非所有这些实际上都已提交,即为其分配了物理后备存储。您可以通过单击将其添加到任务管理器中的显示查看 -> 选择列

最重要的是:如果你想实际测量你的程序使用了多少内存,看看你是否需要优化其中的一些空间或选择更好的数据结构或将一些东西持久化到磁盘,使用任务管理器是错误的方法。您几乎可以肯定使用分析器。

于 2009-07-22T16:55:05.183 回答
0

这取决于您在谈论什么内存。不幸的是,有许多不同的方法来测量记忆。例如 ...

  • 分配的物理内存
  • 分配的虚拟内存
  • 虚拟内存保留(但未提交)
  • 私有字节
  • 共享字节

您对哪个指标感兴趣?

我认为大多数人倾向于对“分配的虚拟内存”类别感兴趣。

于 2009-07-22T16:29:45.297 回答
0

任务管理器显示的内存统计数据几乎不是所有可用的统计数据,也不是特别好呈现。我会使用 Microsoft Sysinternals 的免费工具VMMap来进一步分析应用程序使用的内存。

如果它是一个长时间运行的应用程序,并且内存使用量随着时间的推移而增长,那么它将是正在增长的堆。堆的一部分可能会或可能不会随时被调出到磁盘,但您确实需要优化堆的使用。在这种情况下,您需要分析您的应用程序。如果它是一个 .Net 应用程序,那么我可以推荐 Redgate 的 ANTS profiler。这是非常容易使用。如果它是本机应用程序,那么英特尔 vtune 分析器非常强大。您不需要为任一工具分析的过程的源代码。

这两个应用程序都有免费试用版。祝你好运。

PS对不起,我没有包含更多工具的超链接,但这是我的第一篇文章,stackoverflow将第一篇文章限制为一个超链接:-(

于 2009-07-22T17:43:06.677 回答