2010-11-29 43 views

回答

2

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

您可以在this问题的答案中找到一些推荐的分析器。

1

的Visual Studio探查/性能工具允许你跟踪Object Allocation and Lifetime

不幸的是,这只适用于价格较高的VS层次结构版本。

4

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

要分析内存消耗,我建议您下载&使用.Net Memory Profiler。它真的简化了所有的过程。

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

要在DEV机器上找到进程泄漏,请运行MemProfiler并简单地附加到所需的进程。分析完成后,拍摄一张快照,MemProfiler会告诉您加载了哪些实例以及多少实例,这样您就可以知道分配内存的方式。在不同时刻至少拍摄2张记忆快照,并比较它们以查看“增量实例”。 (如果delta> 0,则创建N个新实例,否则,它们被破坏)

何时收集内存转储?

  • 例如,在您的应用程序成功响应几个请求后,您可以在加载完所有“必需的东西”之后取第一个。
  • 您可能会在进行第二次快照之前对应用程序进行负载测试,因为如果应用程序具有lekead A LOT,那么它更容易找到位置。
  • 您还可以继续加载测试应用程序并拍摄第3张,第4张快照以防万一。

收集有关Web应用程序内存转储在生产环境:

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

  • 要确定Asp.Net W3WP使用此命令(可与W7和Server 2008,didnt试图用2003年):%windir%\system32\inetsrv\appcmd list wp

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

其他提示:

  • 一般来说你的应用程序会出现泄漏的字符串,并在我分析的所有案例都是错误的。在我的情况下,我使用了Asp.NET + WCF + IdentityModel,并且他们使用了很多字符串。
  • 如果你有兴趣,做了“.NET内存分析器教程”在http://memprofiler.com/tutorials/,并按照苔丝Ferrandez博客http://blogs.msdn.com/tess/
  • 如果你认为可能有内存泄漏的地方,但你不知道在哪里能它是,start by watching memory usage per process with Task Manager或进程资源管理器,寻找一个进程总是吃越来越多的RAM:

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

  • 分析内存中的对象时,会在堆上看到ExecutionEngineException,StackOverflowException和OutOfMemoryException。不要惊慌。这并不意味着您的应用程序正在提出这种例外情况,they are always pre-allocated just in case