4

我被这样的想法震惊了/永远。其背后的一般想法是,如果多个集合存在相同的事物(通过弱引用跟踪它们,因此对其进行分析的行为不会保留它),应用程序可以确定潜在的资源泄漏对象。我可以找到方法来询问特定对象在哪一代,我可以找到用于非托管代码的 API 或调试工具来调查托管堆,但我真正想要的是托管调用来给我某种数据结构指定代中的对象。

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

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

4

1 回答 1

2

最近在 Objective-C 领域使用过类似的工具,您可能想要寻找一个 heap-shot 工具。heapshot 工具会拍摄你的堆的快照,从中构建一个内存图,并尝试找出哪些内存是 root 的以及在哪里。这在很大程度上类似于垃圾收集器找出要收集的对象的方式。

通常,堆快照工具允许您在不同时间拍摄堆快照,并比较哪些内存是根的,哪些对象确实占用了该空间。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 生成的一些一般信息。

于 2011-11-22T22:42:41.600 回答