Подтвердить что ты не робот

Как читать моментальный снимок памяти в Visual Studio

Я использую Visual Studio для получения моментального снимка памяти моего приложения.

У меня есть некоторые вопросы о понимании данных, которые я получил. После того как я захватил снимок памяти, я отфильтровываю один из своих классов, скажем, MyClassPanel. Я использую MyClassPanel в своих файлах xmal.

  • почему "Пути к корню для MyClassPanel - это все" MyClassPanel [RefCount Handle, Count: 1]? (то же имя, но со строкой [RefCount Handle в конце] и другим значением Count), что это значит? В другом классе я фильтрую, я вижу, что "Пути к корню" - это разные имена классов.

  • У меня есть 24 MyClassPanel (из подсчета в верхней таблице). И в столбце "Count Count" в нижней таблице, когда я их добавляю, это 24.

Это всегда так? Я думаю, что "Count" и "Count Count" означают разные вещи. В этом случае они складываются. Это имеет смысл?

enter image description here

4b9b3361

Ответ 1

  • В представлении "Пути к корню" показаны ссылки на этот тип, не позволяющие ему собирать мусор. Поскольку ваш класс является страницей Xaml, ссылка, которая поддерживает класс, является обработчиком CLR для страницы Xaml. Они отображаются как RefCount Handle.

  • Количество отсчетов и ссылок действительно не одинаково. Count - количество экземпляров, ссылка подсчитывает количество ссылок. Поскольку каждый экземпляр в вашем случае имеет только одну ссылку, имеет смысл добавить.

Для получения дополнительной информации: http://blogs.msdn.com/b/visualstudioalm/archive/2013/06/20/using-visual-studio-2013-to-diagnose-net-memory-issues-in-production.aspx http://blogs.msdn.com/b/visualstudioalm/archive/2013/10/16/net-memory-analysis-enhancements-in-visual-studio-2013.aspx

Ответ 2

Я не большой поклонник анализатора снимков Visual Studio. Существует довольно много осложнений, если финализация не выполняется должным образом, прежде чем делать снимок. Я не уверен, как это работает с Visual Studio. Тем не менее, снимок, который вы предоставили, не имеет для меня большого смысла.

Я бы предложил вам загрузить профилировщик памяти ANTS и исследовать это. Он поставляется с разумным пробным периодом. Используя это, вы сможете увидеть все ссылки на каждый экземпляр, используя его "График хранения". Он будет конкретно показывать вам, какие экземпляры содержат ссылку на ваши объекты, а также покажет вам, какие объекты были реализованы, Dispose, но не вызвал. Полагаю, это обеспечит большую поддержку, чтобы найти основную причину этой проблемы.

Взгляните на приведенные ниже страницы.

http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/walkthrough http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/