我有一个实验程序长期运行的内存,我想知道它是实际的内存占用。 任务pipe理器(在Windows7-64)说,应用程序消耗800 MB的内存,但分配的内存总量,也根据任务pipe理器,是3.7GB。 所有分配的内存总和不等于3.7GB。 我怎样才能确定我的应用程序实际上消耗了多less内存?
推论:任务pipe理器实际上报告什么内存? 它似乎不是所有分配给应用程序本身的内存。
据我了解,任务管理器显示工作集;
工作集:工作线程最近触及的一组内存页面。 如果计算机中的可用内存超过阈值,则即使未使用页面,页面也会留在进程的工作集中。 当可用内存低于阈值时,页面将从工作集中删除。
通过http://msdn.microsoft.com/en-us/library/cc432779(PROT.10).aspx
你也可以让任务管理器显示虚拟内存。
我通常使用perfmon(开始 – >运行… – > perfmon)跟踪内存使用情况,使用专用字节计数器。 它反映了你的正常分配器分配的内存(new / HeapAlloc / malloc等)。
记忆是一个棘手的事情来衡量。 一个应用程序可能会保留大量的虚拟内存,但实际上并没有使用它。 一些内存可能是共享的; 也就是说,一个共享的DLL可能会被加载到多个应用程序的地址空间中,但是它只会被加载到物理内存中一次。
一个好的方法是工作集 ,它是最近访问过的虚拟地址空间中的一组页面。 “最近访问”的含义取决于操作系统和页面替换算法 。 换句话说,这是虚拟页面的实际集合映射到物理内存,并在此刻被使用。 这是任务管理器显示给你的。
虚拟内存的使用量是已经保留的虚拟页面的数量(注意,并不是所有这些都会被实际提交,也就是说,已经为它分配了物理后台存储),您可以通过点击将其添加到任务管理器中的显示器查看 – >选择列 。
最重要的是 :如果你想实际测量你的程序使用多少内存,看你是否需要优化一些空间,或者选择更好的数据结构或者把一些东西保存到磁盘上,使用任务管理器是错误的做法。 你几乎可以肯定使用一个分析器。
这取决于你在说什么内存。 不幸的是有很多不同的方法来测量内存。 例如 …
你对哪个度量感兴趣?
我想大多数人往往对“虚拟内存分配”类别感兴趣。
由任务管理器显示的内存统计数据几乎不是所有可用的统计数据,也不是特别好显示。 我将使用Microsoft Sysinternals VMMap中的免费工具来进一步分析应用程序使用的内存。
如果它是一个长时间运行的应用程序,并且内存使用量会随着时间的推移而增长,那么这将会是一个正在增长的堆。 堆的部分可能随时也可能不会被分页到磁盘,但是您确实需要优化堆的使用情况。 在这种情况下,您需要分析您的应用程序。 如果是.Net应用程序,那么我可以推荐Redgate的ANTS分析器。 这是非常容易使用。 如果它是本地应用程序,那么英特尔vtune分析器功能非常强大。 您不需要为任何工具分析进程的源代码。
这两个应用程序都有免费试用。 祝你好运。
PS对不起,我没有包含更多的工具超链接,但这是我的第一篇文章,和stackoverflow限制第一篇文章到一个超链接:-(