是否可以查看调用GC.Collect()时收集的所有 .net对象?
我需要查看哪些对象仍在内存中而不是回收,所以我可以找到回收对象应该手动完成的地方,但程序员已经忘记了这一点。
我不想调用GC.Collect,因为有人在某个地方忘记了处理阻塞某些句柄的对象。
答案 0 :(得分:8)
我发现最好的方法是使用windbg和SOS(罢工之子)扩展。它有一个相当神秘的命令行,但它非常强大。它具有转储堆并由GC生成堆分割的能力。一旦超过初始学习曲线,就可以很容易地跟踪堆的哪个部分中存在的对象。以下是一些网站,其中包含使用SOS的示例
编辑 OP询问了sos.dll的位置。它包含在.Net Framework的安装中。它位于
%WINDIR%\ Microsoft.Net \框架\ V2.0.50727 \ sos.dll
但是一旦你加载了windbg,就不需要完整的路径了。只是我们的.loadby方法。
.loadby sos mscorwks.dll
它将在与当前版本的mscorwks(CLR)相同的目录中查找sos的版本
答案 1 :(得分:1)
我使用SciTech's Memory profiler。使用蝙蝠有点复杂,但有一些很好的教学视频。它可以让你看看哪些对象没有正确处理,它们被收集在哪一代。没有它就无法调试内存泄漏...