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