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:
Il mucchio è sempre in aumento:
Confrontando istantanee del Spettacoli heap:
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?
Il ** frame ** conserva una cronologia di navigazione. Succede ancora quando si cancella il backstack una volta ogni tanto? –
Ho aggiornato il codice sopra per cancellare il backstack, la memoria continua ad aumentare nel task manager come prima. – tagy22
Quando ottieni una soluzione, condividila in una risposta automatica. Le persone nelle risposte qui sotto (cancellate) lo chiedono. Grazie – Drew