我有一个正常的专用工作组的约80 MB的一个.NET服务。 在最近的负载测试,过程中达到了3.5 GB的内存使用情况造成整个机器要低物理内存(3.9 4 GB的使用),并负载测试停止后内存未释放长。 使用任务管理器,我把过程的转储文件,并在Visual Studio 2010 SP1打开一看,我能够在它开始调试。
如何诊断内存问题? 我有dotTrace内存3.x的在我手上,它支持在转储文件内存分析? 如果不是,将内存分析的Visual Studio 2010中的高级的帮助功能(我现在有专业)? WinDbg的帮助?
更新:新的Visual Studio 2013旗舰版现在可以本机使用诊断转储文件存储的问题。 请参见这篇博客了解更多详情。
安装的WinDbg。 你需要确保你根据你的转储的正确版本x86或x64。 这里是一个直接链接到下载用于x86。
关于这一点,你需要确保你把正确的转储。 您可以使用任务管理器来创建转储文件(右键单击程序 - >创建转储文件)。 如果你在64位和你的过程是86使用任务管理器(C:\ WINDOWS \ Syswow64资料\的TaskMgr.exe)的32位版本,以转储文件。 请参阅我的文章服用转储文件,例如,如果你在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的,谷歌是你的朋友。
一般来说,如果你有一个托管应用程序泄漏,这意味着什么是没有得到收集。 常见来源包括
要解决这一点,你需要检查托管堆。 WinDbg的+ SOS(或PSSCOR)将让你做到这一点。 该!dumpheap -stat
命令列出了整个托管堆。
你需要有各类型的实例数量的一个想法,希望在堆上。 一旦你找到的东西,看起来很奇怪,你可以使用!dumpheap -mt <METHOD TABLE>
命令可以列出一个给定类型的所有实例。
下一个步骤是分析这些实例的根。 随机挑选一个并做了!gcroot
上。 这将表明,特定的实例是如何扎根。 寻找事件处理程序和固定的对象(通常代表静态引用)。 如果你看到了终结队列中有你需要检查什么终结线程正在做什么。 使用!threads
和!clrstack
命令为。
如果一切正常你移动到另一个实例的实例。 如果不产生任何你可能需要回去在堆再看看,并从那里重复。
泄漏的其他来源包括:未卸载和大对象堆的碎片大会。 SOS / PSSCOR可以帮你找到这些为好,但我会跳过细节现在。
如果你想知道更多,我建议苔丝的博客 。 我也做了几个涉及如何使用WinDbg + SOS(视频这里和这里 )。
如果你同时运行调试过程中的选择,我建议使用PSSCOR而不是SOS。 PSSCOR本质上是已经得到增强,附加命令和许多现有的SOS命令已得到改进,以及在SOS来源私有分支。 例如PSSCOR版的!dumpheap
命令有一个非常有用的三角柱,这使得解决内存泄漏容易得多。
为了使用它,你需要开始你的过程中,连接WinDbg和加载PSSCOR,并做了!dumpheap -stat
。 然后你让进程再次运行这样的分配制成。 打破执行和重复命令。 现在PSSCOR会告诉你添加/删除自上次检查该实例的数量。
由于版本2017.2 JetBrains公司dotMemory支持Windows内存转储以其实力和花哨的GUI分析。
http://msdn.microsoft.com/en-us/library/ee817660.aspx
微软有一个莅临指导。 然而,对于初学者来说太艰难。
dotTrace可产生视觉记忆图表(比WinDbg的更好),但从来没有使用它垃圾堆。