Обнаружить невыделенные экземпляры класса в работающем процессе? - PullRequest
4 голосов
/ 06 июня 2011

У меня есть приложение IIS, которое работает в w3wp.exe. Я не уверен на 100%, если один из моих классов расположен и увеличивает объем памяти с течением времени (просто смотреть на использование памяти в диспетчере задач не так уж надежно).

Есть ли простой способ получить дамп памяти (это легко в Win2008 через диспетчер задач), загрузить его в WinDbg или Visual Studio и просто спросить "Сколько экземпляров Foo.Bar в этом дампе памяти?"

Я знаю, что могу / должен использовать Memory Profiler, но сейчас у меня нет такой возможности, поскольку это производственная система.

Ответы [ 2 ]

4 голосов
/ 06 июня 2011

Есть ли простой способ взять память дамп (это легко в Win2008, через Диспетчер задач), загрузите его в WinDbg или Visual Studio и просто спросите "Сколько экземпляры Foo.Bar находятся в этом дамп памяти?

Вы можете использовать Proc Dump , чтобы получить дамп памяти.

В WinDbg !dumpheap –stat даст вам распределение по типу

Если вы используете !dumpheap -type Foo.Bar, вы должны получить только те классы, которые начинаются с Foo.Bar

см. SOS.dll (расширение отладки SOS) для получения дополнительной информации

1 голос
/ 06 июня 2011

Вы можете использовать класс декоратора, который имеет финализатор и метод dispose и предупреждает вас о пропущенном удалении.Поэтому, если ваш класс подобен этому:

public class CustomerTracker
{
   public bool IsNew() {...}
}

Затем определите интерфейс и заставьте код клиента использовать его:

public interface ICustomerTracker
{
   public bool IsNew();
}

Определите декоратор и используйте его там, где вы создаете любой из этихобъекты:

public class CustomerTrackerMemDecorator : ICustomerTracker
{
   ICustomrTracker tracker;

    CustomerTrackerMemDecorator (ICustomrTracker tracker)
    {
            this.tracker = tracker;
    }

    public bool IsNew() { return tracker.IsNew(); }

    ~CustomerTrackerMemDecorator
    {
            Debug.Assert("Missed dispose found!");
    }

    public override Dispose()
    {
            tracker.Dispose();
            GC.SupressFinalize(this);
    }
}

Тогда где бы вы ни находились:

CustomerTracker tracker = new CustomerTracker ();

замените его на

ICustomerTracker tracker = newCustomerTrackerMemDecorator (новый CustomerTracker ());

...