Невозможно найти ожидаемые объекты в профилировщике использования памяти VS 2015

У меня есть следующая простая программа, которую я пытаюсь использовать с диагностическими инструментами VS 2015, связанными с использованием памяти.

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Begin");
        Console.ReadLine();
        Goo();
        Console.WriteLine("End");
        Console.ReadLine();
    }

    private static void Goo()
    {
        var list = new List<string>();
        for (var i = 0; i < 1000; i++)
        {
            Foo(list);
        }
    }

    private static void Foo(IEnumerable<string> strings)
    {
        foreach (var str in strings)
        {

        }
    }
}

При профилировании проекта этого приложения я сделал несколько снимков и ожидал увидеть 1000 в штучной упаковке List<string>+Enumerator объекты. Например, я получаю такую ​​информацию в JetBrains dotMemory товар. Но по какой-то причине я не могу увидеть эту информацию в инструменте VS... Я явно что-то упускаю... Кто-нибудь может указать мне правильное направление?

Как вы можете видеть на приведенном выше снимке, я получаю информацию о mscorlib Модуль только там, где я не вижу никакой информации о моей исполняемой программе. Что я пропускаю?... немного больше информации ниже:

  • я использовал Start Diagnostic Tools Without Debugging в визуальной студии
  • Взяв и открыв снимок, я даже отменил выбор Collapse small objects чтобы увидеть, скрывает ли это какую-либо информацию, но это также не помогло.

Обновлено (в ответ на пользовательский ответ): я использую dotMemory версии 4.4. Ниже приведен снимок данных, которые я получаю от него. ПРИМЕЧАНИЕ: обязательно нажмите кнопку Collect Allocations прежде чем нажать любую клавишу, увидев Begin сообщение

2 ответа

Решение

Все объекты, созданные в Goo и Foo, уже собраны, когда вы получаете снимок в точке "Конец". Я профилировал этот код с помощью dotMemory 10.0.1, а также не вижу объектов, созданных в методах Goo и Foo.

ОБНОВЛЕНИЕ: В dotMemory вы смотрите на представление "Трафик памяти". Память трафика - это объекты, созданные и возможные уже собранные на момент времени. dotMemory отображает предупреждение о невозможности отображения собранных объектов. Если вы установите флажок "Начать сбор данных о распределении немедленно" в диалоговом окне настройки профилирования, dotMemory покажет вам, что эти 1000 объектов были выделены и уже собраны. В VS Diagnostic Tools вы смотрите на график живых объектов. Я не очень знаком с этим инструментом, но, похоже, нет информации о трафике памяти.

Если вы посмотрите на график живых объектов в dotMemory (представление "Все объекты"), вы также не найдете эти объекты.

Инструмент анализа памяти работает, перебирая все корни GC и просматривая оттуда графы объектов - подобно тому, что делает GC. Как только метод выходит из области видимости, локальная переменная, содержащая перечислитель, больше не является корнем GC. Любые объекты кучи, чья ссылка хранится в локальной системе и на которую не ссылаются через другой корень GC, недоступны и по существу ушли в этот момент.

Другие вопросы по тегам