Есть ли какой-нибудь инструмент, чтобы он мог получить кучу кучи из работающего приложения и определять/группировать объекты по тому, где в исходном коде они были созданы?
Без изменений в исходном коде и в идеале что-то бесплатно.
Есть ли какой-нибудь инструмент, чтобы он мог получить кучу кучи из работающего приложения и определять/группировать объекты по тому, где в исходном коде они были созданы?
Без изменений в исходном коде и в идеале что-то бесплатно.
Как другие предложили профилировщики памяти, Memprofiler определенно самый продвинутый (я пробовал все существующие профилировщики .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