我的Windows应用程序实际使用了多少内存?

7
我有一个长时间运行的实验性程序,它的内存占用很高,我想知道它实际的内存占用情况。任务管理器(在Windows7-64中)显示该应用程序正在消耗800 mb的内存,但根据任务管理器显示的总分配内存为3.7gb。所有分配内存的总和不等于3.7gb。我如何实时确定我的应用程序实际消耗多少内存。
推论:任务管理器实际上报告了哪些内存?似乎并不是分配给应用本身的所有内存。
4个回答

2
据我所理解,任务管理器显示工作集;
工作集:进程线程最近访问的一组内存页面。如果计算机上的空闲内存高于阈值,则即使不使用,页面也会留在进程的工作集中。当可用内存低于阈值时,页面将从工作集中修剪。
可以通过http://msdn.microsoft.com/en-us/library/cc432779(PROT.10).aspx来查看任务管理器显示的虚拟内存。
通常我使用perfmon(开始->运行...->perfmon)来跟踪内存使用情况,使用私有字节计数器。它反映了正常分配器(new/HeapAlloc/malloc等)分配的内存。

@Kim:所以,了解分配给特定应用程序的内存量并不是一个好方法,只能知道最近有多少被使用过,对于给定的“最近”价值。 - mmr

2
记忆是一件棘手的事情。一个应用程序可能会保留大量的虚拟内存,但实际上并没有使用很多。其中一些内存可能是共享的;也就是说,一个共享的 DLL 可能会加载到多个应用程序的地址空间中,但它只会被加载到物理内存中一次。
一个好的度量是工作集,这是其虚拟地址空间中最近访问过的页面集合。"最近访问过" 的含义取决于操作系统及其页面替换算法。换句话说,它是实际映射到物理内存并在当前使用的虚拟页面集合。这就是任务管理器所显示的内容。
虚拟内存使用量是已保留的虚拟页面数量(注意,并非所有这些页面都实际提交了,也就是说,并未分配物理后备存储器)。你可以通过单击 "查看 -> 选择列" 将其添加到任务管理器中的显示中。
最重要的是:如果你想实际测量程序使用了多少内存,以确定是否需要优化一些空间或选择更好的数据结构或将某些内容持久化到磁盘中,使用任务管理器是错误的方法。你应该几乎肯定使用分析器。

我最终可以使用分析器,但我想在应用程序本身中不减速的情况下查看使用了多少内存。最终,这是必要的,但就目前实际消耗的内存量而言,看起来perfmon是正确的工具。 - mmr

0

这取决于你所说的是哪种内存。不幸的是,有许多不同的方式来衡量内存。例如...

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

你对哪个指标感兴趣?

我认为大多数人 tend to be interested in the "Virtual Memory Allocated" category。


这是因为通常无法控制内存何时被交换到磁盘上吗? 因为似乎分配的物理内存是引起问题的罪魁祸首。 我自己对这种相互关系也不太清楚... - D'Arcy Rittich
@OrbMan,我不确定第一部分。 我不会排除存在某些API的可能性,该API说“请勿交换此页面的内存”,但我手头上不知道有哪个。 - JaredPar
@JaredPar:我对64位地址空间中已分配了多少感兴趣,不一定是那些内存被分配到哪里。也就是说,我的数组有多少个和多大?我是否犯了一个错误,没有删除我认为已经删除的其中一两个? - mmr

0
任务管理器显示的内存统计数据并不是所有可用的统计数据,也没有特别好的呈现方式。我建议使用微软Sysinternals提供的免费工具VMMap来进一步分析应用程序所使用的内存。
如果这是一个长时间运行的应用程序,并且内存使用量随着时间增长,那么增长的将会是堆。堆的某些部分可能会被分页到磁盘上,但你真正需要优化的是堆的使用。在这种情况下,你需要对应用程序进行性能分析。如果它是一个 .Net 应用程序,我可以推荐 Redgate 的 ANTS 性能分析器。它非常易于使用。如果它是一个本地应用程序,那么英特尔 vtune 性能分析器非常强大。你不需要为你正在分析的进程获取源代码。
这两个应用程序都有免费试用版。祝你好运。
P.S. 很抱歉我没有包含更多的工具超链接,但这是我的第一篇文章,而 stackoverflow 限制第一篇文章只能有一个超链接 :-(

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接