2015-11-26 12 views
25

Ich habe eine UWP Windows 10 App und bemerkte, dass die Speicherauslastung im Task-Manager im Laufe der Zeit zunimmt.UWP Windows 10 App Speicher auf Navigation

Ich zog die App zurück und fand den Speicher erhöht, wenn die Navigation Seiten. Also habe ich eine einfache App mit nur ein paar Seiten zum Testen gemacht und der Speicher nimmt in dieser einfachen App noch zu. Ich habe eine MainPage, die einen Frame von Page1 zu Page2 und zurück auf einem Timer navigiert.

Page1 und Page2 sind leere Seiten mit einem Gitter mit einer Hintergrundfarbe, so dass Sie die Navigation sehen können. Während diese App ausgeführt wird, erhöht sich die Speicherbelegung im Task-Manager alle 30 Minuten um ca. 1 MB.

enter image description here

Der Haufen wird immer größer:

enter image description here

Verglich man Schnappschüsse von den

Ich habe die App mit der Speicherdiagnose in VS2015 der verwalteten Heap wird wie erwartet ausgeführt Heap zeigt:

enter image description here

Ich bin verwirrt, was diese McgInterop Objekte sind? und warum eine solche einfache App immer mehr Speicher benötigt. Meine Haupt-App muss lange laufen (Monate +). Schätze jede Hilfe.

Ich habe versucht, die Seiten NavigationCacheMode zu ändern, wenn sie auf Erforderlich gesetzt sind, werden die Seiten einmal erstellt. Wenn diese Option deaktiviert ist, werden die Seiten jedes Mal erstellt, und ich habe überprüft, dass der Finalizer wie erwartet aufgerufen wird.

-

bearbeiten: Ich habe eine Taste, um den Timer zu starten und zu stoppen (die oben aktualisiert). Es sieht so aus, als würde die Speicherbelegung im Task-Manager bei laufendem Timer ansteigen, wenn der Timer gestoppt wird, sinkt die Speicherbelegung.

ich die Speichernutzung in Task-Manager über einen Tag gemessen Start und der Timer um alle 2 Stunden stoppen wie folgt, erhöht sich langsam und dann irgendwann fällt:

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

Also denke ich, alles funktioniert gut? Aber mir ist nicht klar, was hier passiert, warum steigt es so sehr? Wann wird unter welchen Bedingungen frei?

Verzögert das System die Freigabe des Speichers, während die Seiten navigieren? Wann würde der Benutzer normalerweise mit dem Bildschirm interagieren?

+4

Der ** Rahmen ** behält einen Navigationsverlauf. Tritt dies immer noch auf, wenn Sie den Backstack hin und wieder löschen? –

+0

Ich habe den obigen Code aktualisiert, um den Backstack zu löschen, der Speicher wird im Taskmanager wie zuvor immer noch erhöht. – tagy22

+1

Wenn Sie eine Lösung erhalten, teilen Sie sie bitte in einer Selbstantwort mit. Leute in den Antworten unten (gelöscht) fragen danach. Danke – Drew

Antwort

0

Jedes Mal, wenn Sie zu einer Seite navigieren, erstellen Sie eine neue Instanz von Page, die vorherige Seite wird jedoch nicht entfernt (auch wenn die Seite bereits im Navigationsstapel enthalten ist).

Um die Mehrfachbelegung derselben Seite zu verhindern, setzen Sie das Attribut NavigationCacheMode="Enabled" auf die Seite.

Um die Speicherzuweisung zu minimieren, müssen Sie außerdem die Methoden OnNavigatedTo und OnNavigatedFrom außer Kraft setzen.

In OnNavigatedTo Methode:

  • Instantiate alle intensive Speicherobjekt oder Ressourcen
  • hinzufügen alle Veranstaltungen Handler Sie benötigen
  • startet alle Timer, Aufgaben oder Threads

In OnNavigatedFrom:

  • Entsorgen Sie alle Ressourcen
  • Stoppt alle Timer, Aufgaben oder Threads
  • Referenzen Entfernen von allen schweren Gegenstände
  • entfernen Alle Veranstaltungen Handler
  • Nur wenn Sie wirklich brauchen, rufen Sie GC.Collect()
+0

Von meiner Frage: Ich habe versucht, die Seiten NavigationCacheMode zu ändern, wenn sie auf Erforderlich gesetzt sind, werden die Seiten einmal erstellt. Wenn diese Option deaktiviert ist, werden die Seiten jedes Mal erstellt. – tagy22

+0

@ tagy22 Wenn Sie "erforderlich" verwenden, besteht die Gefahr, dass der Arbeitsspeicher nicht mehr ausreicht. Bei aktiviertem Betriebssystem werden die Seiten nur dann zwischengespeichert, wenn dies möglich ist. Bei Deaktivierung sollte das Betriebssystem die Instanzen automatisch freigeben, um den Speicher freizugeben, bevor nicht mehr genügend Arbeitsspeicher zur Verfügung steht, aber meiner Erfahrung nach funktioniert es nicht sehr gut. Auch wenn Sie den Cache verwenden, müssen Sie die Ressourcen auf "OnNavigatedFrom" ablegen, zum Beispiel können Sie den Timer absetzen, statt ihn einfach zu stoppen. –

0

Ich habe das gleiche Problem auf w8.1 mit printingInline mit charmBar gesehen es verbraucht eine Menge Speicher bis zum Absturz der Anwendung (1,5 GB). Normalerweise brauchen Sie GC.colect() aber nicht automatisch.

Verwandte Themen