2015-03-07 10 views
22

Zrobiłem aplikację na telefon z systemem Windows, która niestety ma wyciek pamięci, ponieważ strony nie są usuwane poprawnie. To zostało rozwiązane za pomocą odpowiedź:Usuwanie projektu/stron/elementów sterujących użytkownika z pamięci

Remove Pages windows phone Stwierdzenie:

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) 
{ 
while (App.RootFrame.RemoveBackEntry() != null) ; //line if you navigate without backkey 
base.OnNavigatedTo(e); 

this.Dispatcher.BeginInvoke(() => 
{ 
    GC.Collect(); 
    GC.WaitForPendingFinalizers(); 

    this.Dispatcher.BeginInvoke(() => 
    { 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 

     this.Dispatcher.BeginInvoke(() => 
     { 
      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 
     }); 
    }); 

}

ten usunięto odniesienia stronę od Profiler. Ale pamięć wciąż wzrastała podczas nawigacji. I nie było oczywiste, skąd pochodzi zwiększona pamięć. Dlatego Próbowałem wprowadzenie pusty projekt i poruszać się, że jako nawigacji gwiazdkowym Illustrated jako:

enter image description here

To sprawiło usunięte w górę o 20 MB, z wizualizacjami i innych elementów. To był duży krok. Dlatego chciałem podzielić funkcjonalność na różne projekty, aby usunąć wszelkie powiązania między różnymi funkcjami i utrzymać niskie zużycie pamięci. To skończyło się następującą strukturą:

  • WebService
  • MainProject
  • SecondaryProject
  • PortableLibrary

dzielę modeli pomiędzy wszystkimi projektami z wykorzystaniem przenośnego Library. To wpłynęło na to, że po każdej nawigacji do nowego projektu wszystko jest wyczyszczone w starym projekcie, tj. Istnieje tylko jeden element każdego elementu, znaczna poprawa pamięci. Ale wciąż jakiś wyciek pamięci, jakkolwiek ograniczony, oznaczający tylko pewien wzrost pamięci. Ale skąd pochodzi wspomnienie? Wracając do profilera:

enter image description here

To pokazuje, że strony nie są usuwane konkretnie, wszystkie elementy .view. zostałby usunięty przez kod w konfiguracji wszystkich stron będących w jednym projekcie. Jednak przeciek pamięci jest podobny.

Pytanie

  1. Jak mogę usunąć strony i elementy z innego projektu w ciągu samo rozwiązanie?
  2. Jak usunąć projekt z pamięci?

Nie ma informacji udostępnionych między dwoma projektami, z wyjątkiem tych, które mogą utworzyć wersję LibraryOfModels. Dlatego nie ma żadnych wydarzeń, zmiennych ani odniesień w granicach projektu. Ale za moje życie nie mogę usunąć tego z pamięci. Chcę je usunąć z pamięci, tak jak mój fragment kodu u góry, JEŚLI nawigacja była tylko w ramach jednego projektu. Problem istnieje, ponieważ nawigacja jest rozłożona na dwa projekty. Ale ma pewne zalety pamięci w innych obszarach, dlatego chcę tej struktury.

Mam nadzieję, że ktoś może pomóc. Thx!

Dodatkowe testy

Próbowałem czyniąc wszystkie strony UserControls takie, że mogę uniknąć nawigację. Ale odtwarzając je kilka razy gav stały wyciek 1-2 Mb. Idea projektu jest zatem najlepsza, ponieważ istnieje granica. Ale wciąż nie ma rozwiązania, aby je usunąć.

Wciąż mając nadzieję na rycerza z klawiaturą shiney;)

+2

Czy na pewno nie ma żadnych wydarzeń? –

+0

Tak, te dwie strony są podzielone na dwa różne projekty i nie mają związku. Ponieważ nie mogą odnosić się do tych samych elementów ze względu na podział w różnych projektach. Nie mówię, że nie ma zdarzeń wewnątrz różnych projektów, dlatego byłoby interesujące usunięcie całego projektu, ponieważ nie miałoby to żadnych problemów z uruchomieniem, ponieważ te odwołania nigdy nie byłyby wywoływane. Myślisz, że wewnętrzne odniesienie do projektów utrzyma je przy życiu bez żadnych odniesień wskazujących na projekt? – JTIM

+0

Myślę, że kiedy ładujesz strony, możesz wypróbować wzór singletonowy –

Odpowiedz

3

myślę, że można zrobić pojedyncza obiektu i można ręcznie wyczyścić wartości obiektów, gdy odpowiednio. Patrz poniżej https://msdn.microsoft.com/en-us/library/ff650316.aspx

+0

Jak stwierdzono w powyższych komentarzach, nie widzę, jak to powinno rozwiązać problem. O ile mogę przeczytać z twojego linku, wymusi tylko jeden element obiektu. Ale odnosząc się do obrazu z mojego pytania, widać, że istnieje tylko jedno wystąpienie obiektów. Jak więc to pomoże mi usunąć istniejące strony z pamięci? Zaleta posiadania tylko jednej pamięci jest już osiągnięta, ponieważ strony znajdują się w różnych projektach, a ja usuwam ten backstack, co wpływa na to, że strony będą przerabiane podczas każdej nawigacji (pożądane), ale niektóre strony wciąż istnieją, jak czy pomoc singletona? – JTIM

+0

Singleton nie pomoże. jedyną rzeczą jest to, że w pamięci jest tylko przykład. czy możesz wyjaśnić, w czym może pomóc singleton? –

+0

@ jobyjames85: singleton tworzy tylko jeden obiekt naraz, więc obsługa obiektów będzie łatwa i jeśli w niektórych sytuacjach, jeśli singleton nie zostanie użyty, a garbage collector nie zostanie poprawnie obsłużony, wystąpią przecieki pamięci dla tego typu dużych programów. –

0

odnośnik Znajdź wszystkie jednorazowe grafika/IO, upewnij się, że ich wyrzucać, (po zakończeniu korzystania z nich).
Wszystkie takie obiekty dziedziczące po interfejsie IDispose.

0

Uwaga na elementy sterujące/biblioteki innych firm, Image, LongListSelector, FlipView lub WebView, ponieważ mają one pewne problemy z zarządzaniem pamięcią.

Należy upewnić się, że żadne wątki/zadania/timery nie odwołują się do twoich widoków/ViewModels.

Istnieją dwa ciekawe artykuły o przecieki pamięci:

Chyba trudno będzie znaleźć przyczynę bez przykładowego projektu. Jeśli nie występuje w pustym projekcie o tej samej architekturze, oznacza to, że w Twoim kodzie występuje pewien problem.

Powiązane problemy