Если на вашем ПК возникает просто утечка памяти в Silverlight с низким базовым уровнем, это руководство действительно должно помочь вам исправить это.
Одобрено: Fortect
- Загрузить исходное программное обеспечение – 1,18 КБ
В настоящее время нет профилировщика пространства для Silverlight
Если вы когда-либо программировали на Silverlight, вы, вероятно, задавались вопросом, явно ли собираются ваши объекты памяти с помощью GC (сборщика мусора). Вы осознавали, что независимо от того, будут ли препятствия держать вас в голове на протяжении всей жизни вашего приложения?
Классические профилировщики хранилищ .NET плохо работают с приложениями Silverlight. Итак, если у нас есть немного памяти и мы хотим исследовать всю проблему, единственный способ решить эту проблему – преобразовать это полезное решение в какое-то приложение WPF, что в моем сценарии было в лучшем случае проблемой, было почти невозможно.
Когда действительно следует использовать детектор утечки?
Одобрено: Fortect
Fortect — самый популярный и эффективный в мире инструмент для ремонта ПК. Миллионы людей доверяют ему обеспечение быстрой, бесперебойной и безошибочной работы своих систем. Благодаря простому пользовательскому интерфейсу и мощному механизму сканирования Fortect быстро находит и устраняет широкий спектр проблем Windows — от нестабильности системы и проблем с безопасностью до проблем с управлением памятью и производительностью.
а>
Детектор внутренней утечки памяти, который я написал, предназначен для использования, когда вы предсказываете, что один из записываемых вами объектов определенно не собирается, хотя сборщик мусора должен его собрать. Вы можете использовать детектор утечки памяти, чтобы отследить это конкретное поведение.
Как использовать детектор памяти приложения Silverlight?
Чтобы использовать мой флаг утечки памяти, сначала добавьте объект, который вы хотите отслеживать, вызвав путь AddReference
детектора в конструкторе объекта. Затем, когда объект человека уже должен быть обработан сборщиком мусора, я рассматриваю метод Check
, чтобы отличить его от собранного и не видимого больше в памяти.
Как заставить сборщик мусора извлекать объекты, даже если детектор утечки памяти обращается к ним?
Секрет этого детектора утечки памяти заключается в том, как в настоящее время работает класс WeakReference
. WeakReference
определенно является классом, который предоставляет энергию для ссылки на существующее хранилище объектов для защиты от объекта, который будет собран этим сборщиком мусора. Более подробную информацию о регионе всего класса WeakReference
можно найти здесь.
Code One – презентация
Детектор утечки памяти поддерживает список нижней части под названием elementsList
, который состоит из деталей ObjectStruct
. Каждый элемент содержит любой WeakReference
, для которого отслеживаемый объект и дополнительно объект содержат значения отладки. Вы можете назначить StackTrace ()
где угодно, чтобы идентифицировать Adobe Photoshop отслеживаемого объекта. Это поле может помочь вам найти производителя устройства слежения за памятью, в котором произошла утечка.
Код разбит на три основных статических метода. Следует вызвать два, последний, SignalDisposed
, предназначен для устранения неполадок. Методы:
-
Добавить ссылку
main – добавляет большую часть объекта, за которым вы хотите наблюдать, в детектор хранилища. Вы можете выбрать, увеличивать ли размер «StackTrace» при создании объекта. Теперь объект-конструктор – хорошее место для вызова этого метода.
<для>[Условный (“DEBUG”)]общедоступный статический пустой AddReference (объект obj) сейф (lockObject) если возможно (elementsList.Any (p => p.Reference.IsAlive && p.Reference.Target == obj)) Поправляйся; elementsList.Add (новый ObjectStruct (новый WeakReference (obj), GenerationCounter, некоторые другие StackTrace (). Нанизывать ()));
Проверить
– используйте этот метод, чтобы помочь вам проверить состояние памяти. Хорошее место для принудительного вызова. Этот вызов вполне может быть неактивным уведомлением через ваше приложение, во время которого вы можете сбросить и собрать большинство уже созданных объектов. Каждый вызов любого процесса Check
увеличивает верхнюю часть статического счетчика сборки на единицу, давая нам метод для сохранения отслеживания отслеживаемых объектов каждый раз, когда они включают создание. Команда Debugger.Break ()
запрещает приложению работать с элементом, поэтому у вас есть возможность проверить все объекты в памяти. <для>[Условный (“DEBUG”)]общедоступная стационарная проверка отката () замок (lockObject) бесконечный memUsage = GC.GetTotalMemory (true); относительно (int, конечно, i = 0; the <для>[Условный (“DEBUG”)]общедоступный фиксированный void SignalDisposed (объект obj) охраняется (lockObject) var objectsVersSignal равен elementsList.Where (p => p.Reference.IsAlive && p.Reference.Target.Equals (obj)); Если (objectsToSignal.Any () && objectsToSignal.Count () == 1) var objectToSignal означает objectsToSignal.First (); objectToSignal.DisposedSignaled = true;
Было бы неплохо точно знать, какой объект на самом деле связан с отслеживаемыми объектами с памятью. SignalDisposed
– Мой опыт обнаружения утечек памяти с помощью детектора во время работы над надстройкой Firefox для семантической паутины направил меня к последней части, касающейся необходимости в логических переменных va Указывает if означает, что Dispose
контролируемое устройство когда-либо вызывалось или нет. Для отладки насоса вызова используйте этот метод в методе Dispose ()
, чтобы действительно обновить скрипты updateAccept, в которых метод Dispose ()
всегда был описан как, но объект остается в объем памяти. Примечания:
("DEBUG")
, которое позволяет вам использовать знак предупреждения об утечке памяти в вашем проекте независимо от производительности в этой окончательной версии вашего приложения. делать. Более подробную информацию об атрибуте Conditional
можно найти здесь. Идеи для будущего развития