大家好 在c#中识别内存泄漏的最佳实践是什么?
答案 0 :(得分:6)
怎么样
ANTS Memory Profiler™: Profile the memory usage of your .NET application
答案 1 :(得分:4)
首先,安装最新版本的Microsoft调试工具。这是先决条件。
为了分析内存消耗,我建议你下载&使用.Net Memory Profiler。它确实简化了所有过程。
MemProfiler允许从托管应用程序,Windows服务,asp.net应用程序和内存转储中分析托管内存利用率。
要在DEV计算机上查找进程的泄漏,请运行MemProfiler并简单地附加到所需的进程。在进行性能分析后,拍摄快照,MemProfiler将告诉您加载了哪些实例和多少实例,这样您就可以知道分配内存的是什么。在不同时刻拍摄至少2个内存快照,并比较它们以查看“增量实例”。 (如果delta> 0,则创建N个新实例。否则,delta <0,它们被销毁)
什么时候收集内存转储?
在生产环境中的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>
其他提示:
如果你认为可能某处有内存泄漏,但你不知道它在哪里,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层次结构中更昂贵的版本。