2015-11-26 15 views
25

Mam aplikację UWP dla systemu Windows 10 i zauważyłem, że wykorzystanie pamięci w menedżerze zadań rośnie z czasem.UWP Windows 10 Pamięć aplikacji zwiększająca się podczas nawigacji

Odebrałem aplikację i stwierdziłem, że pamięć zwiększa się podczas nawigacji stron. Stworzyłem więc prostą aplikację z kilkoma stronami do przetestowania, a pamięć wciąż rośnie w tej prostej aplikacji. Mam stronę główną, która porusza się po ramce od strony Strona1 do strony2 iz powrotem na zegar.

public sealed partial class MainPage : Page 
{ 

    private DispatcherTimer _timer; 

    private bool _page1Showing; 
    private bool _timerRunning; 

    public MainPage() 
    { 
     this.InitializeComponent(); 

     _timer = new DispatcherTimer(); 
     _timer.Interval = new TimeSpan(0, 0, 0, 0, 200); 
     _timer.Tick += _timer_Tick; 
    } 

    private void _timer_Tick(object sender, object e) 
    { 
     GC.Collect(); 

     this.rootFrame.BackStack.Clear(); 
     this.rootFrame.ForwardStack.Clear(); 

     if (_page1Showing) 
     { 
      this.rootFrame.Navigate(typeof(Page2)); 
      _page1Showing = false; 
     } 
     else 
     { 
      this.rootFrame.Navigate(typeof(Page1)); 
      _page1Showing = true; 
     } 
    } 


    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     if (_timerRunning) 
     { 
      _timer.Stop(); 
      _timerRunning = false; 
     } 
     else 
     { 
      _timer.Start(); 
      _timerRunning = true; 
     } 
    } 

} 

Page1 i Strona2 to puste strony z siatką z kolorem tła, dzięki czemu można wyświetlić nawigację. Podczas tej aplikacji zużycie pamięci w Menedżerze zadań wzrasta o około 1 MB co 30 minut.

mam uruchomić aplikację za pomocą diagnostyki pamięci w VS2015 zarządzanej stercie jest zgodnie z oczekiwaniami:

enter image description here

stosie jest zawsze rośnie:

enter image description here

Porównywanie migawek Sterty pokazuje:

enter image description here

Jestem zdezorientowany czym są te obiekty McgInteropa? i dlaczego tak prosta aplikacja zawsze zwiększa wykorzystanie pamięci. Moja główna aplikacja musi działać przez długi czas (miesiące +). Doceniam każdą pomoc.

Próbowałem zmienić strony NavigationCacheMode, jeśli jest ustawione na Wymagane strony są tworzone tylko raz. Jeśli ustawione jest wyłączone, Strony są tworzone za każdym razem, a ja sprawdziłem, czy finalizator jest wywoływany zgodnie z oczekiwaniami.

-

Edit: Dodałem przycisk, aby uruchomić lub zatrzymać stoper (zaktualizowane wyżej). Wygląda na to, że podczas pracy licznika zużycie pamięci w Menedżerze zadań wzrośnie, gdy licznik zostanie zatrzymany, zużycie pamięci ostatecznie spada.

I mierzono zużycia pamięci w menadżera zadanie od dnia rozpoczęcia i zatrzymanie licznika czasu, około co 2 godziny w następujący powoli wzrasta, a następnie spada w pewnym punkcie:

12,5 -> 17,1 -> 16,7 -> 13,9 -> 16,8 -> 22,5 -> 13,6 -> 14,6 -> 24,9 -> 15,2

Zgaduję, że wszystko działa dobrze? Ale nie wiem, co się tutaj dzieje, dlaczego tak bardzo się zwiększa? Kiedy jest on wolny w jakich warunkach?

Czy system opóźnia zwolnienie pamięci podczas nawigacji stron? kiedy użytkownik zwykle wchodzi w interakcję z ekranem?

+4

** Ramka ** zachowuje historię nawigacji. Czy to się zdarza, kiedy raz na jakiś czas usuniesz backstack? –

+0

Zaktualizowałem powyższy kod, aby wyczyścić backstack, pamięć wciąż rośnie w Menedżerze zadań, tak jak poprzednio. – tagy22

+1

Gdy pojawi się rozwiązanie, podziel się nim w samodzielnej odpowiedzi. Ludzie w odpowiedziach poniżej (usunięci) pytają o to. Dzięki – Drew

Odpowiedz

0

Za każdym razem, gdy przechodzisz do strony, tworzysz nową instancję strony, ale poprzednia strona nie jest usuwana (nawet jeśli strona jest już na stosie nawigacji).

Aby zapobiec wielokrotnemu przydzielaniu tej samej strony, ustaw atrybut NavigationCacheMode="Enabled" na stronie.

Ponadto, aby zminimalizować przydzielanie pamięci, należy zastąpić metodę OnNavigatedTo i OnNavigatedFrom.

W OnNavigatedTo metody:

  • instancję wszystkich pamięci intensywnej obiektu lub zasobów
  • Dodaj wszystkie zdarzenia teleskopowe musisz
  • uruchamia wszystkie timery, zadania lub wątki

W OnNavigatedFrom:

  • Usunąć wszystkie zasoby
  • Zatrzymuje wszystkie liczniki, zadania lub wątki
  • Usuń referencje od wszystkich ciężkich przedmiotów
  • Usuń wszystkie zdarzenia Wozy
  • Tylko jeśli naprawdę potrzebujesz, zadzwoń GC.Collect()
+0

Z mojego pytania: I próbowałem zmienić strony NavigationCacheMode, jeśli jest ustawione na Wymagane, strony są tworzone tylko raz. Jeśli jest ustawione na wyłączone, Strony są tworzone za każdym razem – tagy22

+0

@ tagy22 Jeśli użyjesz wymaganego, ryzykujesz utratą pamięci, z włączoną opcją buforowania stron OS, jeśli to możliwe. Po wyłączeniu system operacyjny powinien automatycznie zwolnić pamięć instancji, aby zwolnić pamięć, zanim wyjdzie z pamięci, ale z mojego doświadczenia wynika, że ​​nie działa ona zbyt dobrze. Również jeśli korzystasz z pamięci podręcznej, musisz pozbyć się zasobów na "OnNavigatedFrom", na przykład możesz wyrzucić zegar zamiast po prostu go zatrzymać. –

0

Widziałem ten sam problem na w8.1 z printingInline przy użyciu charmBar zużywa dużo pamięci aż do awarii aplikacji (1,5 GB). ale normalnie nie potrzebujesz GC.colect(), to działa automatycznie.