.net - 如何使用转储文件来诊断内存泄漏?

标签 .net visual-studio-2010 memory-leaks crash-dumps memory-profiling

我有一个 .NET 服务,其正常私有(private)工作集约为 80 MB。在最近的一次负载测试中,该进程的内存使用量达到了3.5GB,导致整机物理内存不足(使用了4GB中的3.9GB),并且在负载测试停止后很长时间内存都没有释放。使用任务管理器,我获取了该进程的转储文件并在 Visual Studio 2010 SP1 中打开它,然后我就可以开始对其进行调试。

如何诊断内存问题?我可以使用 dotTrace Memory 3.x,它是否支持转储文件上的内存分析?如果没有,Visual Studio 2010 Premium 的内存分析功能会有帮助吗(我目前有 Professional)? WinDbg 可以提供帮助吗?

UPDATE: The new Visual Studio 2013 Ultimate can now natively diagnose memory issues using dump files. See this blog post for more details.

最佳答案

安装WinDbg。您需要确保根据您的转储获得正确的 x86 或 x64 版本。这是 download 的直接链接对于 x86。

对此,您需要确保您进行了正确的转储。您可以使用任务管理器创建转储文件(右键单击进程 -> 创建转储文件)。 如果您使用的是 64 位且进程是 x86,请使用 32 位版本的任务管理器 (C:\Windows\SysWOW64\taskmgr.exe) 来获取转储文件。请参阅my article有关获取转储文件的更多信息,例如,如果您使用的是 XP 并且需要使用 Windbg 来创建转储文件。

警告有一个相当陡峭的学习曲线,事情可能不会完全按照此处描述的方式工作,因此如有任何问题请回来。

我假设您正在使用 .NET4,因为您可以在 Visual Studio 中打开转储。这是一个非常快速指南,可帮助您使用 dmp 文件:

1) 运行WinDbg,将符号路径(文件->符号搜索路径)设置为

SRV*c:\symbols*http://msdl.microsoft.com/download/symbols

2) 打开故障转储或将 .DMP 文件拖到 WinDbg 上。

3)在命令窗口中键入此内容

.loadby sos clr

(仅供引用,对于 .NET 2,命令应为 .loadby sos mscorwks)

4) 然后输入此内容

!dumpheap -stat

其中列出了对象的类型及其数量。 看起来像这样:

enter image description here

您必须在应用程序的上下文中对此进行分析,看看是否有任何异常情况。

windbg 还有更多功能,Google 是您的 friend 。

关于.net - 如何使用转储文件来诊断内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9514401/

相关文章:

c# - 在 Visual Studio C# 中,有没有办法将 Web Config 转换应用于 Javascript 文件?

c# - 如何获取 ControlPaint 绘制的边框宽度?

c# - 是否有不区分大小写的 string.Replace 替代方法?

regex - 在 Visual Studio 2010 中使用正则表达式查找和替换小写

c++ - 如何使用 Visual Studio C++ 2010 创建 PNG 图像?

Java:一个指向可达对象的无法到达的对象会被垃圾收集吗?

tomcat - Tomcat 6 中的 sun.net.www.http.HttpClient 内存泄漏

jsf - MyFaces 中的内存泄漏

c# - 如何在 C# 中快速读取二进制文件? (ReadOnlySpan 与 MemoryStream)

c# - 在 .NET 4.5 中是否有更好的方法将变量名称作为字符串获取?