是否可以查看调用GC.Collect()时收集的所有**.net对象?**我需要查看哪些对象仍在内存中并且没有回收,这样我就可以找到哪些地方应该手动回收对象,但是程序员忘记了。我不想调用GC.Collect,因为某个地方的某个人忘记释放一个对象,而这个对象阻塞了一些句柄。
njthzxwz1#
我发现最好的方法是使用windbg和SOS(son of strike)扩展。它有一个相当神秘的命令行,但它非常强大。它具有转储堆并将其除以GC代堆的能力。一旦您通过了最初的学习曲线,跟踪堆的哪个部分中哪些对象是活动的非常容易。
微软公司但是一旦你加载了windbg,你就不需要完整的路径,只需要.loadby方法。.loadby sos mscorwks.dll文件加载它将在当前版本的mscorwks(CLR)所在的目录中查找sos的版本
llmtgqce2#
我使用SciTech's Memory profiler。它的使用有点复杂,但有一些很好的教学视频。它会让你看到哪些对象没有被正确处理,它们是在哪一代收集的。没有它就不能调试内存泄漏...
2条答案
按热度按时间njthzxwz1#
我发现最好的方法是使用windbg和SOS(son of strike)扩展。它有一个相当神秘的命令行,但它非常强大。它具有转储堆并将其除以GC代堆的能力。一旦您通过了最初的学习曲线,跟踪堆的哪个部分中哪些对象是活动的非常容易。
EDITOP询问sos.dll的位置。它随.Net Framework的安装一起提供。它位于
微软公司
但是一旦你加载了windbg,你就不需要完整的路径,只需要.loadby方法。
.loadby sos mscorwks.dll文件加载
它将在当前版本的mscorwks(CLR)所在的目录中查找sos的版本
llmtgqce2#
我使用SciTech's Memory profiler。它的使用有点复杂,但有一些很好的教学视频。它会让你看到哪些对象没有被正确处理,它们是在哪一代收集的。没有它就不能调试内存泄漏...