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

我的windows应用程序实际使用了多少内存?,windows,memory,taskmanager,Windows,Memory,Taskmanager,我有一个长期运行的内存占用实验程序,我想知道它的实际内存占用。任务管理器说(在windows7-64中)应用程序消耗了800MB的内存,但根据任务管理器的说法,分配的内存总量为3.7gb。所有已分配内存的总和不等于3.7gb。如何动态确定应用程序实际消耗的内存量 推论:任务管理器实际报告的内存是什么?它似乎并不是分配给应用程序本身的所有内存。这取决于您所谈论的内存。不幸的是,有许多不同的方法来衡量记忆。例如 已分配的物理内存 分配的虚拟内存 保留的虚拟内存(但未提交) 专用字节 共享字节 你

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


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

这取决于您所谈论的内存。不幸的是,有许多不同的方法来衡量记忆。例如

  • 已分配的物理内存
  • 分配的虚拟内存
  • 保留的虚拟内存(但未提交)
  • 专用字节
  • 共享字节
你对哪个指标感兴趣


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

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

工作集:内存页的集合 最近被一个 过程如果在 计算机高于阈值,页 都留在一个工作组中 即使他们不在 用过。当可用内存低于 阈值,页面将从 工作装置

通过

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


我通常使用perfmon(Start->Run…->perfmon)来跟踪内存使用情况,使用私有字节计数器。它反映了普通分配器(new/HeapAlloc/malloc等)分配的内存。

内存是一个很难衡量的东西。一个应用程序可能会保留很多,但实际上不会使用很多。一些内存可能是共享的;也就是说,共享DLL可能加载到多个应用程序的地址空间中,但它只加载到物理内存中一次

一个很好的度量是,它是虚拟地址空间中最近访问过的页面集。“最近访问的”的含义取决于操作系统及其应用程序。换言之,它是映射到物理内存并在当前使用的虚拟页的实际集合。这就是任务管理器向您展示的内容

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


但最重要的是:如果你想实际测量你的程序使用了多少内存,看看你是否需要优化一些内存以获得空间,或者选择更好的数据结构,或者将一些内容保存到磁盘,那么使用任务管理器是错误的方法。你几乎肯定应该使用探查器。

备忘录任务管理器显示的ry统计数据几乎不是所有可用的统计数据,也不是特别好的。我将使用Microsoft Sysinternals提供的伟大的免费工具,进一步分析应用程序使用的内存

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

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


另外,很抱歉,我没有包含更多工具的超链接,但这是我的第一篇文章,stackoverflow将第一篇文章限制为一个超链接:-(

这是因为您通常无法控制何时将内存交换到磁盘?因为似乎分配的物理内存是导致问题的原因之一。我自己也不清楚这种相互关系…@OrbMan,我不确定第一部分。我不会排除现有的一些API,其中“请不要调出这一页内存"但我不知道哪一个是一次性的hand@JaredPar:我感兴趣的是64位地址空间被分配了多少,而不一定是内存被分配到了哪里。比如,我的数组有多少,有多大?我是否犯了一些错误,没有删除一个或两个我认为已经有的数组?@Kim:所以,这不是一个了解内存分配多少的好方法h内存分配给一个特定的应用程序,那么,对于给定的“最近”值,我最终可以使用探查器,但我想看看在应用程序中探查器本身不减速的情况下,有多少内存被使用。最终,这是必要的,但只是为了此时此刻我需要多少内存mory实际上正在被消费,看起来perfmon是正确的工具。