【问题标题】:Memory consumption increases quickly, then drops very slowly; memory leak?内存消耗迅速增加,然后缓慢下降;内存泄漏?
【发布时间】:2013-10-24 22:08:52
【问题描述】:

我在运行我的程序时遇到了这个问题:

  • 当我的程序的一项功能正在运行时,内存消耗会迅速增加。
  • 我使用性能监视器和虚拟泄漏检测,都说没有泄漏。
  • 功能结束后(程序未退出),内存会慢慢下降到正常水平。
  • 程序基本上是C#、WPF、C++;

因此,当内存消耗变高时,我的程序驱动的硬件(电机)响应非常缓慢。

我很困惑。这是内存泄漏吗?

我知道可能很难确定问题出在哪里,但是我应该如何看待这个问题有什么共同的逻辑吗?或者有什么常用的工具?就像检查汽车上的进气泄漏/系统倾斜通常从管道、质量空气流量传感器或 O2 传感器开始......

非常感谢!

【问题讨论】:

  • 由于您的程序最终确实回收了所有已使用的内存,我会说不,这不是泄漏。您的引用可能被持有的时间超过了必要的时间,这可能会导致您看到的行为。尝试使用像 scitech 这样的内存分析器或类似的东西。
  • 但这会引起麻烦。随着程序的运行,硬件响应越来越慢,用户无法忍受。
  • 我并不是说这不是问题,但根据给出的信息,任何事情都是猜测。这就是为什么我建议使用内存分析器的原因,您需要先确定是什么占用了内存,然后才能缓解问题。
  • 所以如果我的程序包含许多 dll,我是否可以找到哪个 dll 正在泄漏?谢谢。

标签: c# c++ wpf memory-leaks


【解决方案1】:

您可以尝试以下几种方法 - 假设您在 Windows 平台上运行,请尝试运行 Sysinternals ProcessMonitor 工具 (Process Monitor v3.2) 并正确配置符号路径和源代码路径。日志很可能会告诉您导致泄漏的行号和来源。您需要知道如何使用进程监视器并浏览日志。

否则,您还可以尝试使用以下 CRT API 来跟踪内存分配/释放并吐出内存泄漏转储以进行进一步调查。以下代码仅在调试模式下工作。

    #define _CRTDBG_MAP_ALLOC
    #include <stdlib.h>
    #include <crtdbg.h>

    #ifdef _DEBUG   
      #ifndef DBG_NEW      
         #define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )      
      #define new DBG_NEW   
      #endif
    #endif  // _DEBUG

    _CrtMemState crtMemStateStart;
    _CrtMemState crtMemStateFinish;

    _CrtMemCheckpoint(&crtMemStateStart);


    // Your suspisious code


     _CrtMemCheckpoint(&crtMemStateFinish);

      int nDifference(0);
      _CrtMemState crtMemStateDifference;
      nDifference = _CrtMemDifference(&crtMemStateDifference, &crtMemStateStart, &crtMemStateFinish);

    if(nDifference > 0)
        _CrtDumpMemoryLeaks();

查看此链接了解更多信息:Finding Memory Leaks Using the CRT Library

请记住,内存泄漏总是很难找到,尤其是在涉及 COM 代码的情况下。但是拥有正确的知识和工具肯定会让生活变得更轻松。

【讨论】:

  • 非常感谢。我的程序有一个用 C# 编码的启动应用程序,但它加载了很多 dll、托管和非托管、运行时,我不知道哪个 dll 可能会导致问题。那么在这种情况下,我应该指向什么源代码?首发,或任何可疑的人?另外,这是我当前的符号路径:srv*msdl.microsoft.com/download/symbols,但我不知道应该如何配置它。任何想法?谢谢。
  • 将源路径设置为包含所有其他项目的父文件夹。如果您没有以这种方式组织您的项目,那么如果可能的话,请重新构建 DLL 和可执行文件。将源路径设置为 SRVC:\MySymCachemsdl.microsoft.com/download/symbols 并确保创建 C:\MySymCache 目录,以便符号在本地缓存,而不是总是从 Microsoft 符号服务器下载。
  • 我还建议安装 Microsoft Windows SDK(可在 Microsoft 网站上免费获得,只需使用您喜欢的搜索引擎搜索即可)以从中获取 dbghelp.dll。这是 DLL 的更新版本,比安装在 C:\Windows\System32 目录中的 Windows 附带的更强大。默认的不能在本地缓存符号。使用更新版本并用于正确的平台 (x86/x64) 非常重要。
【解决方案2】:

Memory Profiler 为我工作:

Memory Profiler trial version download

这是试用版,我喜欢它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 2021-12-25
    • 2010-12-23
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多