我有一个 .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
其中列出了对象的类型及其数量。 看起来像这样:
您必须在应用程序的上下文中对此进行分析,看看是否有任何异常情况。
windbg 还有更多功能,Google 是您的 friend 。
关于.net - 如何使用转储文件来诊断内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9514401/