.net – 我可以找到一代垃圾收集器中的所有对象吗?

我很惊讶,如果一个应用程序能够定期扫描垃圾收集器中第2代或大型对象堆中的对象,可能会很有趣,看看它是否能够发现长时间徘徊的东西/永远.其背后的一般想法是,如果多个集合存在相同的事物,应用程序可以确定潜在的资源泄漏对象(通过弱引用跟踪它们,以便分析它的行为不会保留它).我可以找到方法来询问特定对象的生成代码,我可以找到非托管代码的API或调查托管堆的调试工具,但我真正想要的是一个托管调用,以便为我提供某种类型的数据结构指定代中的对象.

我是否有希望找到这样的东西,或者我在寻找不存在的东西?

从理论上讲,可能会出一个调试器应用程序的实例并解析结果或其他东西,但我希望它能在低负载时在实时Web服务器上运行,而且我不确定操作会不会喜欢我附加调试器,即使有可能:)

最佳答案 最近在Objective-C领域使用过类似的工具,你可能想要寻找一个堆射工具.快照工具将获取堆的快照,从中构建内存图并尝试找出哪些内存是根的以及在哪里.其中大部分与垃圾收集器找出要收集的对象的方式类似.

通常,快照工具允许您在不同时间拍摄堆的快照,并比较根据哪些内存以及哪些对象占用该空间. Mono Heapshot https://github.com/mono/heap-shot似乎是一个很好的起点,虽然我没有亲自使用它.我过去在JetBrains dotTrace Memory上取得了不错的成绩.不幸的是,这两种工具都不会向您展示对象所处的世代,但它们可以跟踪对象身份,有时甚至可以跨快照.如果您发现一个对象在多个集合中存活,它可能会存在于更高代.确切的生成是实现,运行时和环境特定.

其他内存分析器肯定存在. Microsoft CLR上的一个非常好的工具是WinDbg和SOS扩展.这是一篇很好的msdn杂志文章:http://msdn.microsoft.com/en-us/magazine/cc163528.aspx,我发现Tess来自(奇妙的名字)“如果它被破坏了,你应该修复它”博客也有很棒的内容. http://blogs.msdn.com/b/tess/

可以通过http://msdn.microsoft.com/en-us/library/x2tyfybc.aspx中记录的一组性能计数器检索有关堆结构和GC生成的一些常规信息.

点赞