2009-07-22 94 views
7

我有一个实验程序长时间运行的内存,我想知道它是实际的内存占用量。任务管理器说(在windows7-64中)应用程序消耗800MB内存,但根据任务管理器分配的总内存量为3.7GB。所有分配的内存总和不等于3.7GB。我怎样才能确定我的应用程序实际在使用多少内存?我的Windows应用程序真正使用多少内存?

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

回答

2

据我所知,任务管理器显示工作集;

工作组:该组最近通过 进程的线程感动内存页 。如果 计算机中的可用内存超过阈值,则 页面将保留在 进程的工作集中,即使它们不是 使用。当空闲内存低于 阈值时,页面将从 工作集中删除。

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

你可以得到任务管理器来显示虚拟内存。

我通常使用perfmon(开始 - >运行... - > perfmon)跟踪内存使用情况,使用专用字节计数器。它反映了你的正常分配器分配的内存(new/HeapAlloc/malloc等)。

0

这取决于你在说什么内存。不幸的是,有很多不同的方法来测量内存。例如...

  • 分配的物理内存
  • 虚拟内存分配
  • 虚拟内存保留(但不提交)
  • 专用字节
  • 共享字节

哪一项指标是你有兴趣吗?

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

+0

这是因为你通常无法控制内存何时交换到磁盘?看来物理内存分配是导致问题的原因之一,我不清楚这种相互关系本身... – RedFilter 2009-07-22 16:35:03

+0

@OrbMan,我不确定第一部分,我不会计算出一些API存在的说:“请不要换出这页的内存”但我不知道一个手头 – JaredPar 2009-07-22 16:42:22

+0

@JaredPar:我感兴趣的是64位地址空间已分配多少,而不一定是那个内存得到的地方如何,我的阵列有多少和多大?我没有删除一个或两个我认为已经拥有的那些我犯了一些错误吗? – mmr 2009-07-22 16:49:09

2

内存是一个棘手的事情来衡量。应用程序可能会保留大量的virtual memory,但实际上并未使用其中的大部分。一些内存可能是共享的;也就是说,一个共享的DLL可能会被加载到多个应用程序的地址空间中,但它只会被加载到物理内存中一次。

一个好的方法是working set,它是最近访问过的虚拟地址空间中的一组页面。 “最近访问”的含义取决于操作系统及其page replacement algorithm。换句话说,它是映射到物理内存并且正在使用的实际虚拟页面集合。这是任务管理器向您显示的内容。

虚拟内存使用量是已经保留的虚拟页面数量(请注意,并非所有这些实际上都会被提交,也就是说,物理后备存储已分配给它)。通过点击查看任务管理器 - >选择列

最重要的事情,虽然:如果要实际测量你的程序使用多少内存,看看是否需要优化它的一些空间或选择更好的数据结构或者把一些东西存放到磁盘上,使用任务管理器是错误的方法。你应该几乎可以肯定使用一个profiler。

0

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

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

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

P.S.对不起,我没有包含更多的工具超链接,但这是我的第一篇文章,并且stackoverflow限制第一篇文章到一个超链接:-(

相关问题