Jeśli na niektórych komputerach występuje niski bazowy wyciek pamięci Silverlight, ten przewodnik powinien pomóc w jego rozwiązaniu.
Zatwierdzono: Fortect
- Pobierz oprogramowanie źródłowe – 1,18 KB
Obecnie nie ma programu Space Profiler dla Silverlight
Jeśli może kiedykolwiek programowałeś w Silverlight, prawdopodobnie zastanawiałeś się, czy może twoje obiekty pamięci są gromadzone przez konkretny GC (odśmiecacz). A co, jeśli przeszkody będą o Tobie pamiętać przez całe życie aplikacji indywidualnej – czy wiesz?
Klasyczne profilery magazynu .NET nie działają dobrze z aplikacjami Silverlight. Jeśli więc mamy małą przestrzeń dyskową i chcemy zbadać problem, w zasadzie jedynym sposobem rozwiązania problemu jest przeniesienie tego przydatnego rozwiązania do aplikacji WPF, co ogólnie w moim scenariuszu było co najmniej trudne, było prawie niemożliwe.
Kiedy naprawdę należy używać wykrywacza nieszczelności?
Zatwierdzono: Fortect
Fortect to najpopularniejsze i najskuteczniejsze narzędzie do naprawy komputerów na świecie. Miliony ludzi ufają, że ich systemy działają szybko, płynnie i bez błędów. Dzięki prostemu interfejsowi użytkownika i potężnemu silnikowi skanowania, Fortect szybko znajduje i naprawia szeroki zakres problemów z systemem Windows - od niestabilności systemu i problemów z bezpieczeństwem po zarządzanie pamięcią i wąskie gardła wydajności.
Detektor wycieku pamięci, który napisałem, jest przeznaczony do użycia, gdy podejrzewasz, że ten związany z pisanymi obiektami nie jest przechowywany, chociaż garbage collector musi go zebrać. Możesz użyć detektora wycieku pamięci do ścieżki tego konkretnego zachowania.enia.
Jak korzystać z detektora pamięci aplikacji Silverlight?
Aby użyć mojej flagi wycieku pamięci, najpierw dodaj obiekt, który chcesz śledzić, kontaktując się ze ścieżką AddReference
detektora w konstruktorze obiektu. Następnie, gdy obiekt powinien do tej pory być zbierany bezużytecznie, wywołuję metodę Check
, aby upewnić się, że został zebrany i nie jest już widoczny w przestrzeni pamięci.
Jak zmusić odśmiecacz do pobierania obiektów, nawet jeśli wykrywacz przecieków pamięci ma do nich dostęp?
Sekretem tego detektora wycieków pamięci jest sposób działania klasy WeakReference
. WeakReference
jest zdecydowanie na klasę, która zapewnia możliwość odwoływania się do pewnego rodzaju istniejącej składnicy obiektów, aby zapobiec pierwotnemu zebraniu obiektu dzięki uprzejmości garbage collectora. Więcej informacji o regionie klasy WeakReference
można znaleźć tutaj.
Kod pierwszy — prezentacja
Detektor wycieku pamięci RAM utrzymuje listę bazową żądaną elementsList
, która składa się ze szczegółów ObjectStruct
. Każdy element zawiera WeakReference
, dla którego wartości debugowania obiektu śledzonego i kontroli obiektu kontrolują. Możesz użyć StackTrace ()
w dowolnym innym miejscu, aby zidentyfikować ilustratora śledzonego obiektu. To pole może pomóc w znalezieniu aktualnie producenta urządzenia pamięci masowej, które zostało opublikowane.
Kod jest podzielony na 3 lub więcej głównych metod statycznych. Pierwsze dwa powinny być stale wywoływane, ostatni, SignalDisposed
, zawsze służył do rozwiązywania problemów. Metody:
-
Dodaj współpracownika
main – Dodaje obiekt, który chcesz monitorować do detektora magazynu. Możesz bardzo dobrze zdecydować, czy rozwinąć „StackTrace” podczas tworzenia przydatnego obiektu. Obiekt konstruktora jest dobrym regionem do wywołania tej metody.
Sprawdź
— użyj tej metody, aby sprawdzić stan miejsca w pamięci. Dobre miejsce do wymuszenia Odniesieniem tego połączenia może być nieaktywne powiadomienie za pośrednictwem Twojej aplikacji, w której możesz dostosować i zebrać większość już utworzonych urządzeń. Każde wywołanie Check
oznacza zwiększenie statycznego licznika kompilacji o jeden, co daje nam metodę śledzenia monitorowanych obiektów za każdym razem, gdy są tworzone. Polecenie Debugger.Break()
zatrzymuje aplikację na elemencie, dzięki czemu można sprawdzić wszystkie materiały w pamięci. SignalDisposed
— Moje doświadczenie z wykrywaniem wycieków pamięci wraz z detektorem podczas pracy nad dodatkiem do przeglądarki Firefox dla sieci semantycznej doprowadziło mnie do tego, jak ostatnia część dotycząca zapotrzebowania na czynniki logiczne va Wskazuje, czy < code> wskazuje Dispose jakiś rodzaj monitorowanego urządzenia został wywołany lub ale nie. Aby debugować przepływ wywołań, użyj tej struktury w metodzie Dispose ()
, aby móc naprawdę zaktualizowaćAccept skrypty, w których wywołano metodę Dispose ()
, ale towar pozostaje w pamięci. Uwagi:
- Wszystkie trzy funkcje mają klasyczny warunek
("DEBUG")
, który umożliwia pomyślne użycie wskaźnika przecieku pamięci w twoim rozwoju, niezależnie od wydajności w ostatecznej wersji dołączonej do twojej aplikacji. robić. Więcej informacji na temat niektórych atrybutówWarunkowe
można znaleźć tutaj. - Klasa jest bezpieczna wątkowo.
Pomysły dotyczące przyszłego rozwoju
Normalnie dobrze byłoby wiedzieć, który obiekt jest ściśle powiązany ze śledzonymi obiektami w pamięci.