Определение места выделения объектов для объектов в куче

Существует ли какой-либо инструмент, который может получить дамп кучи из запущенного приложения и определить / сгруппировать объекты по месту в исходном коде, в котором они были созданы?

Без изменений в исходном коде и в идеале что-то бесплатно.

7 ответов

Решение

Как предлагали другие профилировщики памяти, http://memprofiler.com/ определенно является наиболее продвинутым (я пробовал все существующие профилировщики.NET). Он имеет 14-дневную пробную версию.

Как насчет.NET Memory Profiler от ANTS, например. Может быть, CLR Profiler.

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

Если вы создаете точку останова, поэтому она сбрасывает стек, у вас будет точка создания объекта. Однако имейте в виду, что объекты могут перемещаться во время GC, что затруднит парринг объектов со стопками (или даже невозможен в некоторых случаях).

Так как ваш вопрос связан с производительностью и профилированием, я понял, что вы хотите уменьшить выделение памяти. Почему бы просто не посмотреть на количество созданных объектов (или, возможно, посмотреть на самые большие созданные объекты), посмотрев на кучу. Затем просмотрите исходный код и выясните, где такие экземпляры создаются.

Вам нужен.NET профилировщик памяти. Эти инструменты позволяют вам следить за графами объектов в куче мусора и могут быть очень полезны для выявления источников утечек памяти. Хотя они могут не обязательно сообщать вам метод, в котором был создан объект, они сообщают, какие экземпляры каких классов удерживают объекты, и позволяют вам делать различия снимков кучи gc. Они не требуют изменений в исходном коде. Возможно, вы захотите взглянуть на " Что такое хорошие профилировщики.NET"?

Наши команды QA используют http://www.jetbrains.com/profiler/ для такого рода вещей, когда мы сталкиваемся с узкими местами. Я уверен, что он даст вам список распределений по вызову метода. Я пойду установлю и проверю:)

Старый добрый windbg + sos + pdb сделает демпинг. Что касается части "где в исходном коде они были созданы" - это невозможно без инструментовки или внедрения.

Расширение отладки SOS

Как использовать: http://msdn.microsoft.com/en-us/library/yy6d2sxs.aspx

Другие вопросы по тегам