是否可以查看调用GC.Collect()时收集的所有.net对象?
我需要看看哪些对象仍在内存中而不是回收,所以我可以找到回收对象应该手动完成的地方,但程序员已经忘记了.
我不想调用GC.Collect,因为有人在某处忘记了处理阻塞某些句柄的对象.
我发现最好的方法是使用windbg和SOS(罢工之子)扩展.它有一个相当神秘的命令行,但它非常强大.它具有转储堆并由GC生成堆分割的能力.一旦超过初始学习曲线,就可以很容易地跟踪堆的哪个部分中存在的对象.以下是一些使用SOS的网站
http://blogs.msdn.com/tess/archive/2005/11/25/dumpheap-stat-explained-debugging-net-leaks.aspx
http://geekswithblogs.net/.NETonMyMind/archive/2006/03/14/72262.aspx
http://dotnetdebug.net/2005/07/04/dumpheap-parameters-and-some-general-information-on-sos-help-system/
EDIT OP询问了sos.dll的位置.它包含在.Net Framework的安装中.它位于
%WINDIR%\ Microsoft.Net \框架\ V2.0.50727\sos.dll
但是一旦你加载了windbg,就不需要完整的路径了.只是我们的.loadby方法.
.loadby sos mscorwks.dll
它将在与当前版本的mscorwks(CLR)相同的目录中查找sos的版本