У меня есть процесс хранения 130 МБ памяти в соответствии с диспетчером задач, только с 11 МБ живых .NET-объектов в соответствии с dotTrace, поэтому мне интересно что происходит с другими 120 МБ??
Мне нужен инструмент для перечисления сборок и встроенных DLL файлов, загружаемых в процесс, получения размера обрабатываемых изображений и для каждой сборки измерять объем памяти методов JITed.
ListDlls из SysInternal частично выполняет эту работу. Но он не измеряет размер кода JITed, и он просто предоставляет необработанные данные. В идеале я бы хотел, чтобы пользовательский интерфейс анализировал и суммировал эти данные.
Недавно команда Visual Studio сообщила о проведении такого анализа с помощью инструмента PerfView. Об этом говорится в сообщении в блоге Visual Studio 11 Beta Performance Part # 1, раздел: Самые большие виртуальные машины VM - DLL. У кого-то есть опыт и отзывы, анализирующие исходные Dll и сборки с помощью PerfView?
За исключением ListDlls и PerfView, вы бы рекомендовали какой-либо другой инструмент?
Хорошо, VMMAP, рекомендованный Саймоном Мурье, кажется более подходящим инструментом для этой задачи. VMMAP показывает, что основная часть рабочей памяти набора входит в управляемый стек (113 МБ в зеленом ниже), поэтому проблема больше связана с объектами .NET, чем с неуправляемой памятью. Зеленая кривая зуба, это всего лишь график сеансов погрузки/разгрузки. По некоторым причинам мои первые меры были совершенно неправильными:
- dotTrace говорит мне, что у меня есть 41 МБ объектов .NET,
- WMMAP показывает рабочий набор из 180 МБ (диспетчер задач показывает аналогичное число)
- WMMAP показывает 113 МБ управляемой кучи, выделенной GC. 90MB этой управляемой памяти кучи находится в рабочем наборе:
Итак, мой план:
- Определите, почему GC выделяет 113 МБ управляемой кучи для 41 МБ объектов .NET? (такие числа нормальны? Это связано с высокой фрагментацией?)
- Работа над сокращением этого 41 МБ набора выделенных .NET-объектов!