【发布时间】:2012-06-21 07:47:36
【问题描述】:
我正在开发一个似乎存在内存泄漏的 .NET 应用程序。我知道教科书的答案,应该取消订阅事件,应该处置一次性物品等等......
我有一个可以重现错误的测试工具。在某个类的终结器中,我写到控制台
public class Foo
{
// Ctor
public Foo()
{
}
~public Foo()
{
Console.WriteLine("Foo Finalized");
}
}
在测试工具中,我创建了一个 Foo 实例(它反过来创建并与数百个其他类型交互),然后删除它并调用垃圾收集器。
我发现永远不会调用 Foo 终结器。我有一个与此设置类似的课程,最终确定为控制测试。
所以我的问题是这样的:
我如何才能确定使用商业或开源工具究竟是什么 是否持有对 Foo 的引用?
我拥有 dotTrace Memory profiler 的专业许可,但无法从帮助文件中了解如何使用它。
更新:我现在使用的是dotMemory 4.0,它是(很好,但无法使用)dotTrace Memory 3.5 的后续版本。
【问题讨论】:
-
如果你已经有一个分析器学习使用它 - 我没有经常使用 dotTrace 但我其他两个在使用模式中相似并且也需要一些“入门”
-
@CarstenKönig 对此 +1,我现在正在 dotTrace 中挖掘。发现我可以通过命名空间找到未收集的对象列表(所以找到了我的违规 Foo)以及对它们的引用,再次按命名空间(数百个)过滤,现在通过可疑事件处理程序列表等...跨度>
-
@CarstenKönig 实际上是使用 dotTrace 找到的!它确实具有从 gcroot -> Foo 向下钻取图形的功能,只是有点难以找到。干杯:)
标签: c# memory-leaks garbage-collection