Утечки памяти Silverlight
У нас довольно большое приложение silverlight 4. Мы находимся в процессе обнаружения утечек памяти в приложении, и это превратилось в непростую задачу.
Вещи полностью изменились с этим, для тех из вас, кто видел оригинальный пост!
Я понял, что профилировщик памяти ANTS не показывает мне правильные вещи. Это произошло потому, что утечка памяти была не в управляемом коде, а в собственном коде. Я исправил некоторые проблемы с ANTS - это хороший инструмент для устранения утечек памяти в управляемом коде.
Итак, я нашел этот блог,
Что было отлично. Я использовал xPerf и xPerfViewer, чтобы просмотреть собственную кучу и увидеть, что я подозреваю, является фактической утечкой памяти.
Итак, я вижу трассировку стека, которая выглядит следующим образом,
CCoreServices::Draw
CCoreServices::Tick
CUElement::Render
CUIElement::Render
CUIElement::RenderWithTransform
CUIElement::RenderVisual
CUIElement::RenderChildren
{Repeat of the above in a recursive fashion}
Так что в этом методе Render где-то он выделяет около 520 байт памяти, и, насколько я могу судить, не освобождает его.
Я также могу увидеть метод или класс с именем
SDBitmapCreate
утечка памяти тоже.
Интересно, потому что кажется, что я что-то нашел, но я не совсем уверен, что.
Любые другие предложения?
Благодарю.
4 ответа
Здесь есть хорошее руководство по устранению утечек памяти в Silverlight: http://davybrion.com/blog/2009/08/finding-memory-leaks-in-silverlight-with-windbg/. Это сложно, и вам приходится иметь дело с командами WinDBG, но я нашел это полезным в прошлом. Конечно, это не дает конкретного ответа на ваш вопрос, но может указать вам правильное направление.
Прежде всего, я не знаю ни одного инструмента утечки памяти для Silverlight.
Я испытал то, что я думал, где проблемы утечки памяти несколько недель назад. Оказывается, мое приложение Silverlight содержало детей-мошенников на холсте.
Моя проблема не может быть вашей проблемой, но она может заставить вас задуматься.
Прежде чем я заново заполнил свой список результатами с сервера, мне пришлось удалить всех дочерних элементов из соответствующего холста. Очистки списка было недостаточно.
for (int i = 0; i < boxDataLabel.Count; i++)
{
canvaz.Children.Remove((Label)boxDataLabel[i]);
}
boxDataLabel.Clear();
boxDataLabel представляет собой список типа Label.
удачи.
Существует официальная утечка памяти относительно встроенных шаблонов данных в Xaml. Вы можете прочитать ветку об этом здесь: http://forums.silverlight.net/forums/t/171739.aspx.
Microsoft выпустила сервисную версию (сборка обновления 4.0.50826.0), которая должна решить эту проблему: http://timheuer.com/blog/archive/2010/09/01/silverlight-service-release-september-2010-gdr1.aspx
Не забудьте обновить минимальную версию в html-файле хоста, если сервисный выпуск исправит (некоторые из) ваши проблемы.
Если бы я был в вашей ситуации, я бы попытался создать простое тестовое приложение, которое демонстрирует утечку, просто чтобы перепроверить, что она повторяется за пределами вашего реального кода. Это доказывает, что это не тонкая ошибка в вашем коде. Затем я бы опубликовал тестовое приложение на форумах MS Silverlight, за которым следят люди MS. Если у вас есть подписка MSDN или если у вашей компании есть соглашение о поддержке с MS, я бы также открыл "тикет" (забудьте, как они их называют) с MS.