3

У меня есть следующая простая программа, которую я пытаюсь использовать с помощью диагностических инструментов 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 ... Я, очевидно, что-то пропустил ... может ли кто-нибудь указать мне в правильном направлении?

enter image description here

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

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

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

enter image description here

ответ

2

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

ОБНОВЛЕНИЕ: В dotMemory вы смотрите на «Движение памяти». Memory traffic - объекты, созданные и возможно уже собранные до момента времени. dotMemory показывает вам предупреждение о том, что он не может отображать собранные объекты. Если вы проверите "Start collecting allocation data immediatelly" checkbox в диалоговом окне настройки профилирования, dotMemory покажет вам, что эти 1000 объектов были выделены и уже собраны. В VS Diagnostic Tools вы смотрите live объектов. Я не очень разбираюсь в этом инструменте, но, похоже, нет информации о трафике памяти.

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

+0

Я обновил свое сообщение с моментальным снимком данных, записанных в 'dotMemory'. Убедитесь, что вы нажимаете «Собирать распределения» до ввода любой клавиши после появления строки «Begin» –

+0

Обновлен ответ –

+0

@KiranChalla, пожалуйста, примите ответ, если я ответил на ваш вопрос –

2

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

 Смежные вопросы

  • Нет связанных вопросов^_^