Я работаю над приложением .NET, где, по-видимому, происходит утечка памяти. Я знаю ответы учебника, что события должны быть отписаны, одноразовые объекты должны быть утилизированы и т. д.
У меня есть тестовая программа, которая может воспроизвести ошибку. В финализаторе определенного класса я пишу в консоль
public class Foo
{
// Ctor
public Foo()
{
}
~public Foo()
{
Console.WriteLine("Foo Finalized");
}
}
В тестовой обвязке я создаю один экземпляр Foo (который, в свою очередь, создает и взаимодействует с сотнями других типов), затем удаляю его и вызываю сборщик мусора.
Я обнаружил, что Foo Finalizer никогда не вызывается. У меня есть аналогичный класс с этой настройкой, который дорабатывается как контрольный тест.
Итак, мой вопрос заключается в следующем:
Как я могу определить, используя коммерческие инструменты или инструменты с открытым исходным кодом, что именно держит ссылку на Foo?
У меня есть профессиональная лицензия на профайлер памяти dotTrace, но я не могу понять из файлов справки, как его использовать.
Обновление:Сейчас я использую dotMemory 4.0, которая является преемником (хорошей, но непригодной) dotTrace Memory 3.5.