代码之家  ›  专栏  ›  技术社区  ›  santosh singh

如何识别C中的内存泄漏?[复制品]

c#
  •  7
  • santosh singh  · 技术社区  · 15 年前

    可能重复:
    Anatomy of a “Memory Leak”

    大家好 识别C中内存泄漏的最佳实践是什么?

    4 回复  |  直到 15 年前
        2
  •  4
  •   Gerardo Grignoli    15 年前

    首先,安装最新版本的Microsoft调试工具。这是一个先决条件。

    要分析内存消耗,我建议您下载并使用.NET内存探查器。它确实简化了所有的过程。

    MemProfiler允许从托管应用程序、Windows服务、ASP.NET应用程序和内存转储分析托管内存利用率。

    要在dev机器上查找进程的泄漏,运行memprofiler并简单地连接到所需的进程。一旦进行了分析,就可以截取一个快照,memprofiler将告诉您加载了哪些实例和多少实例,这样您就可以知道是什么在分配内存了。在不同时刻拍摄至少2张内存快照,并将它们进行比较,以查看__delta实例_。(如果delta为>0,则创建了n个新实例。否则,delta<0,它们会被销毁)

    什么时候收集内存转储?

    • 例如,在应用程序成功响应了一些请求之后,您可以在加载了所有所需的__之后选择第一个。
    • 在拍摄第二张快照之前,您可能会对应用程序进行负载测试,因为如果应用程序有很多漏洞,那么就更容易找到漏洞所在。
    • 您还可以继续对应用程序进行负载测试,并拍摄第三、第四个快照,以防万一。

    要在生产环境的Web应用程序上收集内存转储,请执行以下操作:

    • 不需要在服务器上安装调试工具。您可以将其安装在开发人员PC上,然后将文件夹复制到生产环境中。例如C:\Program Files(x86)\Windows调试工具(x86)

    • 要标识ASP.NET W3wp,请使用此命令(适用于W7和Server 2008,未尝试使用2003): %windir%\system32\inetsrv\appcmd list wp

    • 要生成转储,请执行: AdPlus -hang -p <process id> -o <outputDir>

    其他提示:

    • 一般来说,你的应用程序会泄露字符串,在我分析的所有情况下,这都是错误的。在我的例子中,我使用了ASP.NET+WCF+IdentityModel,它们使用了很多字符串。
    • 如果您感兴趣,请执行.NET内存分析器教程,网址为 http://memprofiler.com/tutorials/ 关注Tess Ferrandez的博客 http://blogs.msdn.com/tess/
    • 如果你认为 可能 某个地方有内存泄漏,但你不知道它可能在哪里, start by watching memory usage per process with Task Manager 或Process Explorer,查找总是占用越来越多RAM的进程:

    • 使用ADPLUS生成转储,避免使用任务管理器,因为任务管理器是32位进程,可能会转储64位进程。在这种情况下,memprofiler会感到困惑。

    • 分析内存中的对象时,将在堆上看到ExecutionEngineeException、StackOverflowException和OutOfMemoryException。不要惊慌。它们并不意味着你的应用程序提出了例外, they are always pre-allocated just in case :

        3
  •  2
  •   Community Mohan Dere    9 年前

    使用内存分析器-将其连接到可疑进程并运行可疑操作。

    您可以在以下答案中找到一些推荐的配置文件 this 问题。

        4
  •  1
  •   Steve Townsend    15 年前

    Visual Studio分析/性能工具允许您跟踪 Object Allocation and Lifetime .

    不幸的是,这只在成本更高的版本的vs层次结构中可用。