2015-11-26 26 views
25

Ho un'app UWP per Windows 10 e ho notato che l'utilizzo della memoria nel task manager sta aumentando nel tempo.UWP Windows 10 Memoria dell'app in aumento sulla navigazione

Ho rimosso l'App e ho rilevato che la memoria aumenta quando si naviga nelle pagine. Così ho fatto una semplice app con solo poche pagine da testare e la memoria è ancora in aumento in questa semplice App. Ho una pagina principale che naviga un frame da Pagina1 a Pagina2 e torna su un timer.

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; 
     } 
    } 

} 

Pagina1 e Page2 sono pagine vuote con una griglia con un colore di sfondo in modo da poter vedere la navigazione. Mentre questa applicazione esegue l'utilizzo della memoria in Task Manager aumenta di circa 1 MB ogni 30 minuti.

Ho eseguito l'applicazione utilizzando la diagnostica di memoria nel VS2015 heap gestito è come previsto:

enter image description here

Il mucchio è sempre in aumento:

enter image description here

Confrontando istantanee del Spettacoli heap:

enter image description here

Sono confuso cosa sono questi oggetti di McgInterop? e perché un'applicazione così semplice sta aumentando sempre nell'uso della memoria. La mia app principale deve funzionare per un lungo periodo (mesi +). Apprezzo qualsiasi aiuto.

Ho provato a modificare le pagine NavigationCacheMode, se impostato su Richiesto le pagine vengono create una volta. Se impostato su disabilitato, le pagine vengono create ogni volta e ho controllato che il finalizzatore sia chiamato come previsto.

-

Edit: ho aggiunto un pulsante per avviare e interrompere il timer (aggiornato di cui sopra). Sembra che mentre il timer è in esecuzione, l'utilizzo della memoria in Task Manager aumenterà, quando il timer si arresta, l'utilizzo della memoria diminuisce.

ho misurato l'utilizzo della memoria nel task manager nel corso di un giorno di inizio e l'arresto del timer circa ogni 2 ore come segue, aumenta lentamente e poi scende ad un certo punto:

12.5 -> 17.1 -> 16.7 -> 13.9 -> 16.8 -> 22.5 -> 13.6 -> 14.6 -> 24.9 -> 15.2

Quindi immagino che tutto funzioni correttamente? Ma non sono chiaro cosa sta succedendo qui, perché sta aumentando così tanto? Quando viene liberato in quali condizioni?

Il sistema sta ritardando il rilascio della memoria mentre le pagine stanno navigando? quando l'utente normalmente interagisce con lo schermo?

+4

Il ** frame ** conserva una cronologia di navigazione. Succede ancora quando si cancella il backstack una volta ogni tanto? –

+0

Ho aggiornato il codice sopra per cancellare il backstack, la memoria continua ad aumentare nel task manager come prima. – tagy22

+1

Quando ottieni una soluzione, condividila in una risposta automatica. Le persone nelle risposte qui sotto (cancellate) lo chiedono. Grazie – Drew

risposta

0

Ogni volta che si accede a una pagina, si crea una nuova istanza di Pagina, ma la pagina precedente non è disposta (anche se la pagina è già nello stack di navigazione).

Per impedire l'allocazione multipla della stessa pagina, impostare l'attributo NavigationCacheMode="Enabled" nella pagina.

Inoltre, per ridurre l'allocazione della memoria, è necessario eseguire l'override del metodo OnNavigatedTo e OnNavigatedFrom.

In OnNavigatedTo metodo:

  • un'istanza di tutti gli oggetti intensivo di memoria o le risorse
  • Aggiungere tutti gli eventi i gestori necessari
  • partenze tutti i timer, attività o thread

In OnNavigatedFrom:

  • Eliminare tutte le risorse
  • Interrompe tutti i temporizzatori, i compiti o le discussioni
  • rimuovere i riferimenti da tutti gli oggetti pesanti
  • Rimuovere tutti gli eventi gestori
  • Solo se si ha realmente bisogno, chiami GC.Collect()
+0

Dalla mia domanda: I hai provato a cambiare le pagine NavigationCacheMode, se impostato su Richiesto le pagine vengono create una volta. Se impostato su disabilitato, le Pagine vengono create ogni volta – tagy22

+0

@ tagy22 Se si utilizza la richiesta, si rischia di uscire dalla memoria, con il sistema operativo abilitato a memorizzare le pagine nella cache solo se possibile. Con disabilitato, il sistema operativo dovrebbe rilasciare automaticamente le istanze per liberare la memoria, prima di uscire dalla memoria, ma dalla mia esperienza non funziona molto bene. Inoltre, se si utilizza la cache, è necessario disporre delle risorse su "OnNavigatedFrom", ad esempio è possibile disporre del timer, ma basta fermarlo. –

0

Ho visto lo stesso problema su w8.1 con printingInline usando charmBar sta consumando molta memoria fino al crash dell'applicazione (1,5 GB). ma normalmente non hai bisogno di GC.colect() funziona automaticamente.

Problemi correlati