Утечки памяти Silverlight

У нас довольно большое приложение silverlight 4. Мы находимся в процессе обнаружения утечек памяти в приложении, и это превратилось в непростую задачу.

Вещи полностью изменились с этим, для тех из вас, кто видел оригинальный пост!

Я понял, что профилировщик памяти ANTS не показывает мне правильные вещи. Это произошло потому, что утечка памяти была не в управляемом коде, а в собственном коде. Я исправил некоторые проблемы с ANTS - это хороший инструмент для устранения утечек памяти в управляемом коде.

Итак, я нашел этот блог,

http://blogs.msdn.com/b/slperf/archive/2010/08/19/analyzing-silverlight-memory-usage-part-1-obtaining-measurements.aspx

Что было отлично. Я использовал 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.

Другие вопросы по тегам