Отслеживание .NET-объектов в памяти - PullRequest
2 голосов
/ 30 декабря 2011

Я пишу редактор в C # / .NET, используя AvalonDock.

Если я закрываю документ, потребление памяти моей программой не уменьшается.Даже если я вызову сборщик мусора вручную.Поэтому я предполагаю, что где-то еще есть ссылка на документ.

Программное обеспечение огромно, и документ является центральным компонентом, поэтому найти каждую ссылку на него нелегко.

Имеет ли отладчик Visual Studio 2010 функциональность для поиска объектов определенного класса в памяти или чего-то еще?

В качестве альтернативы, что бы вы сделали, если бы столкнулись с такой проблемой?

Ответы [ 3 ]

7 голосов
/ 30 декабря 2011

Вам необходимо использовать профилировщик памяти, чтобы выяснить, какие объекты находятся в памяти и что содержит на них ссылку.

Существует несколько различных options - коммерческий и бесплатный.

2 голосов
/ 30 декабря 2011

Вы можете делать что хотите, используя бесплатные инструменты.

Основные шаги следующие:

  1. Запустите ваше приложение
  2. Присоедините windbg к его процессу
  3. Загрузить вспомогательный модуль "sos" (.loadby sos mscorwks)
  4. Дамп кучи (! DumpHeap -stat)
  5. Найдите интересующий вас тип и посмотрите, действительно ли он использует память
  6. Дамп кучи для вашего конкретного типа (! DumpHeap -type MyNameSpace.MyType)
  7. Найдите адрес памяти объекта, который, по вашему мнению, должен быть удален, и посмотрите, «где-то» он укоренен. (! gcroot "каким бы ни был адрес")

Я лично использовал эту технику, чтобы добиться значительного эффекта при отслеживании утечек памяти в программах с интенсивным использованием графики c #.

Я узнал об этом от Рико Мариани из Microsoft. Вот запись в блоге, которая описывает это подробно. * http://blogs.msdn.com/b/ricom/archive/2004/12/10/279612.aspx

0 голосов
/ 30 декабря 2011

Помните, что даже когда .net очищает себя, Windows может не принять решение освободить память. Часто это происходит только тогда, когда другому приложению действительно нужна память. Итак, используйте профилировщик памяти:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...