如何识别c#中的内存泄漏?

时间:2010-11-29 17:53:46

标签: c#

  

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

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

4 个答案:

答案 0 :(得分:6)

答案 1 :(得分:4)

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

为了分析内存消耗,我建议你下载&使用.Net Memory Profiler。它确实简化了所有过程。

MemProfiler允许从托管应用程序,Windows服务,asp.net应用程序和内存转储中分析托管内存利用率。

要在DEV计算机上查找进程的泄漏,请运行MemProfiler并简单地附加到所需的进程。在进行性能分析后,拍摄快照,MemProfiler将告诉您加载了哪些实例和多少实例,这样您就可以知道分配内存的是什么。在不同时刻拍摄至少2个内存快照,并比较它们以查看“增量实例”。 (如果delta> 0,则创建N个新实例。否则,delta <0,它们被销毁)

什么时候收集内存转储?

  • 例如,在您的应用成功回复了一些请求后,您可以在加载所有“必需内容”之后选择第一个。
  • 你可能会在拍摄第二张快照之前对应用程序进行负载测试,因为如果应用程序有leakead A LOT,那么更容易找到它。
  • 您还可以继续加载测试应用程序并拍摄第3,第4个快照,以防万一。

在生产环境中的Web应用程序上收集内存转储:

  • 您无需在服务器上安装调试工具。您可以将其安装在开发人员PC上,然后将该文件夹复制到生产环境中。例如:\ 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,他们使用了很多字符串。
  • 如果您有兴趣,可以在http://memprofiler.com/tutorials/上执行“.NET Memory Profiler教程”并关注Tess Ferrandez博客http://blogs.msdn.com/tess/
  • 如果你认为可能某处有内存泄漏,但你不知道它在哪里,start by watching memory usage per process with Task Manager或Process Explorer,寻找一个吃的进程总是越来越多的RAM:

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

  • 分析内存中的对象时,您会在堆上看到ExecutionEngineException,StackOverflowException和OutOfMemoryException。不要惊慌。它们并不意味着您的应用程序引发了异常,they are always pre-allocated just in case

答案 2 :(得分:2)

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

您可以在this问题的答案中找到一些推荐的个人资料。

答案 3 :(得分:1)

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

不幸的是,这只适用于VS层次结构中更昂贵的版本。