Как точно определить, сколько памяти использует каждая надстройка? - PullRequest
0 голосов
/ 07 июня 2018

Можно ли мне точно определить, сколько памяти использует каждая надстройка Outlook?У меня есть несколько клиентов в 32-битном Office, у которых есть проблемы с миганием экрана и сбоями, и я подозреваю, что мы, как компания, развернули слишком много надстроек, и даже с Large Address Awareness (LAA) они работаютНедостаточно памяти, из-за чего Outlook выходит из себя

Я не видел способа сделать это в Outlook, поэтому я создал файл .dmp и открыл его с помощью windbg, но я новичок в этом приложении и понятия не имею, как увидеть конкретныеИспользование памяти определенными надстройками (файл .dmp имеет только outlook.exe)

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Предполагается, что плагины созданы в .NET.

Выделение памяти с помощью оператора new отправляется диспетчеру памяти .NET.Чтобы выяснить, какой плагин выделил память, эта информация также должна быть сохранена в куче .NET.

База данных UST ( User Mode Stack Trace ), например, доступная длядиспетчер кучи Windows недоступен в .NET.Кроме того, диспетчер памяти .NET работает непосредственно над VirtualAlloc(), поэтому он не использует диспетчер кучи Windows.В основном, причина в сборке мусора.

Есть ли способ, чтобы я мог точно определить, сколько памяти использует каждая надстройка Outlook?

Нет, так как этоинформация не сохраняется в аварийных дампах, и для ее включения нет настроек.

Вам нужен профилировщик памяти, специфичный для .NET.

Если вы уже работаете с .NET и Visual Studio, возможно, вы используете JetBrains Resharper.Ultimate Edition поставляется с инструментом под названием dotMemory , поэтому у вас уже может быть лицензия, и вам просто нужно установить ее через панель управления («изменить» установку Resharper).

Он имеет(и другие инструменты, вероятно, также имеют) возможность группировать выделения памяти по сборке:

Screenshot of dotMemory

На снимке экрана показана память, выделенная приложением под названием «MemoryPerformance»».Он сохраняет 202 МБ в объектах, и эти объекты в основном являются объектами .NET Framework (mscorlib).

0 голосов
/ 08 июня 2018

В следующем предполагается, что плагины созданы на C ++ или других «родных» языках, по крайней мере, на .NET.

Выделение памяти с помощью оператора new переходит к HeapAlloc(),Чтобы выяснить, кто выделил память, эту информацию также необходимо будет сохранить в куче.

Однако вы не можете предоставить эту информацию в операторе new, и даже если бы это было возможно,вам нужно будет переписать все операторы new в вашем коде.

Другим способом было бы то, что HeapAlloc() просматривает стек вызовов в тот момент, когда кому-то требуется память.При нормальной работе это слишком дорого (с точки зрения времени) и слишком много накладных расходов (с точки зрения памяти).Однако возможно включить так называемую базу данных трассировки стека в пользовательском режиме , иногда сокращенно называемую базой данных UST.Это можно сделать с помощью инструмента GFlags, поставляемого с WinDbg.

Инструментом для захвата снимков памяти является UMDH, также доступный с WinDbg.Он будет хранить результаты в виде текстовых файлов.Должна быть возможность извлекать статистические данные из этих UST, однако я не знаю инструмента, который бы делал это, а это значит, что вам нужно было бы написать его самостоятельно.

Третий подход - использование концепции"пометки кучи".Тем не менее, это довольно сложно и также требует изменений в вашем коде.Я никогда не реализовывал это, но вы можете посмотреть на вопрос Как извлечь выгоду из тегов кучи с помощью DLL?

Допустим, UST-подход выглядит наиболее выполнимым.Насколько большой должна быть база данных UST?

До сих пор мне было достаточно 50 МБ для выявления и устранения утечек памяти.Однако для этого варианта использования не важно получать информацию обо всей памяти.Просто нужно достаточно образцов, чтобы поддержать гипотезу.Эти 50 МБ ИМХО выделяются в памяти вашего приложения, поэтому это может повлиять на приложение.

В базе данных UST хранятся только адреса, а не текст стека вызовов.Поэтому в 32-битном приложении каждому кадру в стеке вызовов требуется только 32-битная память.

В вашем случае 50 МБ будет недостаточно.Принимая во внимание среднюю глубину 10 кадров и средний размер выделения 256 байтов (4 байта для целого, но также и более крупные объекты, такие как строки), вы получите

4 ГБ / 256 байтов = 16M выделения

16M выделений * 10 кадров * 4 байта / кадр = 640 МБ UST

Если данные предположения реалистичны (я не могу этого гарантировать), вам потребуется размер базы данных UST 640 МБ.Это сильно повлияет на ваше приложение, поскольку оно уменьшает объем памяти с 4 ГБ до 3,3 ГБ, поэтому OOM приходит раньше.

Информация UST также должна быть доступна в файле DMP, если она была настроена в то времяаварийный дамп был создан.Конечно, нет в вашем файле DMP, иначе вы бы сказали нам.Тем не менее, он недоступен для статистики.Использование текстовых файлов UMDH ИМХО - лучший подход.

Можно ли мне точно определить, сколько памяти использует каждая надстройка Outlook?

Нес файлом DMP, который у вас есть на данный момент.Все еще будет сложно с инструментами, доступными в WinDbg.

Осталось еще несколько вариантов:

  • Отключите все плагины и измерьте память самого Outlook.Затем включите один плагин за раз и измерьте объем памяти с помощью этого плагина.Вычислите разницу, чтобы узнать, какая дополнительная память нужна плагину.

  • Сбой сразу при запуске?Или позже, скажем, через 10 минут использования?Может ли это быть утечка памяти?Выявление утечки памяти может быть проще: просто включите один плагин за раз и следите за использованием памяти с течением времени.Используйте профилировщик памяти, а не WinDbg.Его будет намного проще использовать, и он может рисовать соответствующую графику, которая вам нужна.

Обратите внимание, что вам нужно определить четкий процесс для измерения памяти.Некоторая память будет выделяться только тогда, когда вы делаете что-то конкретное («отложенная инициализация»).Возможно, вы тоже хотите измерить эту память.

...