【问题标题】:How reliable is windows task manager for determining memory usage of programs?windows任务管理器确定程序的内存使用情况有多可靠?
【发布时间】:2011-08-09 16:42:24
【问题描述】:

我可以使用任务管理器来检测巨大的内存泄漏吗?我有一个小型文本解析程序,当我启动它时显示内存使用量约为 640K。当我解析文件并为其编制索引时,内存使用量会根据文件的大小而增长。然后,当我“清除”索引时,我的内存使用量下降到 1400K 左右。在此之后,我可以添加任意数量的文件,当我清除索引时,内存使用量会下降到 1400k 级别 + 或 - 大约 5%。

这是在我对程序进行更改之后。在更改之前,每次我索引一些文件然后清除时,内存使用量都会继续上升。所以在多次清除之后,我的程序的内存使用量越来越大。

我意识到这可能是对我的应用进行分析的一种“骇人听闻”的方式,但我是一名学生,我所能找到的只是商业分析工具,这些工具是遥不可及的。我还阅读了有关 valgrind 的信息,它只是 linux 并且我正在 Windows 上开发。使用任务管理器是准确的还是我被误导了?

【问题讨论】:

  • 谢谢,我在搜索中没有遇到这个问题,那里有很好的信息。我还是想知道使用windows任务管理器来感受一下应用程序的内存使用情况,看看有没有泄露的准确性和可行性。
  • 对您的问题的简单回答是肯定的。任务管理器足够可靠,可以告诉进程总共需要多少内存。(从操作系统的角度来看)。但它不会提供任何详细的细节并帮助您进行调试。在您的情况下,看起来您对任务很好经理现在。但是这种方法不会扩展:)

标签: c++ memory-leaks profiling memory-management


【解决方案1】:

TaskMgr 对于这个目的来说太粗糙了。特别是如果您有大量动态分配和释放,这将导致高度碎片化的堆内存,在这种情况下,由于碎片化,很难区分泄漏和堆的自然增长。您应该使用 win32 API 调用来检查应用程序分配的内存总量。几年前,当我仍然遇到内存泄漏问题时(由于 RAII,现在不再有这些问题了),我曾经在 main() 的开头放了一小段代码,用于查询在堆上分配内存块,然后在 main() 函数的最后再次查询,如果两个值不匹配,我会在此时报告“内存泄漏 X 字节”错误。

如果您想这样做,您可以使用GlobalMemoryStatuxExHeapWalk。前者使用起来更简单,速度更快,但更粗糙,而后者更精确,但范围更广。

【讨论】:

    【解决方案2】:

    TaskMgr 是一个非常粗糙的工具,但它仍然很有用。如果您有 1 兆字节范围内的内存泄漏,那么告诉您有它们可能就足够了。但是,最终,您将寻找 10 KB 及以下范围内的泄漏,而 TaskMgr 对这些毫无用处。

    【讨论】:

    • 感谢您的提示。目前我正在寻找的泄漏非常大(几兆)。我正在使用集合和指针,我怀疑在堆上创建的对象根本没有被删除。我仍然无法找出原因,尽管我认为是一些放置得当的删除语句。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 2014-08-26
    • 1970-01-01
    • 2010-09-17
    • 2017-08-16
    相关资源
    最近更新 更多