Невозможно найти ожидаемые объекты в профилировщике использования памяти 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, недоступны и по существу ушли в этот момент.