#c# #silverlight #memory-leaks
#c# #silverlight #утечки памяти
Вопрос:
Почему в Silverlight так много памяти?
Данные:
Иногда у меня возникает много флажков и других в пользовательском интерфейсе. Как само собой разумеющееся, я удаляю флажки и другие элементы управления из визуальных элементов, но использование памяти Silverlight всегда увеличивается; оно никогда не уменьшается.
Как мне убедиться, что память освобождена?
Это проблема со сборкой мусора? Как мне найти корень всех оставшихся объектов без ссылок, которые еще не собраны?
Я могу предоставить больше данных, если это необходимо.
Комментарии:
1. Как вы создаете и удаляете эти элементы управления?
Ответ №1:
Наиболее распространенной причиной нехватки памяти является то, что обработчики событий не отсоединяются от элементов, которые были удалены из дерева объектов.
Что часто ускользает от внимания, так это то, что поля уровня экземпляра (включая делегатов, которые реализуют события) в объекте приложения и MainPage
(или что бы там ни использовалось в качестве RootVisual
) так же хороши, как static
поля, поскольку они обычно живут столько же, сколько и приложение.
Отсюда невинный вид:-
btn.Click = btn_myClickHandler;
в коде главной страницы может привести к утечке памяти, если btn
удаляется из пользовательского интерфейса без соответствующего:-
btn.Click -= btn_myClickHandler;
Комментарии:
1. Вау, хороший совет. Я должен сказать, что на самом деле у меня нет проблем с памятью, но это то, о чем я, вероятно, не подумал бы, когда отлаживал проблемы с памятью.
2. я знаю об этом .. уже была попытка без посторонней помощи. существует какая-то другая ссылка
Ответ №2:
Механизм управления памятью, который использует Silverlight, аналогичен тому, который CLR использует для WPF и других традиционных .СЕТЕВЫЕ приложения. Он основан на сборке мусора, и если вы сохраняете ссылки на объекты, даже случайно, что предотвращает их сборку как мусора, то потребление памяти будет продолжать увеличиваться.
Если у вас возникла эта проблема в вашем приложении Silverlight, вы можете поискать утечки или попробовать использовать инструменты для поиска утечек и определения того, где выделяется большая часть памяти. Вероятно, самый быстрый способ — это профилировщик памяти. К сожалению, не так много профилировщиков памяти, которые работают с Silverlight, но ANTS profiler, у которого есть бесплатная пробная версия, предположительно, работает:
Комментарии:
1. я уже использовал ANTS, он показывает, что объект никогда не собирался, но это помощь