Kann das Speicherleck nicht finden

9

Ich habe an einer WP7-App gearbeitet, der Bildergalerie-App, mit grundlegenden Zoom- und Klappbewegungen implementiert.

Zu Testzwecken habe ich die App mit Offline-Bildern kompiliert (ihre Dateinamen sind nummeriert), die auf Inhalt eingestellt sind und auf sie über eine hartcodierte Zeichenfolge zugreifen (die später ersetzt wird).

Aber wir haben festgestellt, dass die App viel Speicher verbraucht. Ich dachte, dass es an Bildern lag und fand diesen Blog ; Bilder wurden immer zwischengespeichert. Ich habe den Code aus dem Blog verwendet, um dies zu korrigieren. Still-Speicher wird nicht freigegeben, obwohl die Verbrauchsrate gesunken ist.

Für den letzten Versuch habe ich eine weitere Test-App mit der Basisfunktion 2 für Navigation und Bildkontrolle für Bilder erstellt, um sicherzustellen, dass es nicht meine Gestencodes sind, die das Problem sein könnten.

Dies ist das xaml

%Vor%

Dies ist die .cs-Datei

%Vor%

Aber immer noch Speicherleck ist da und ich kann nicht darauf hinweisen. Es fällt mir schwer, es zu finden. Speicherprofiler zeigt, dass ich viele Instanzen einer Zeichenfolge habe, und ich kann das nicht interpretieren.

Einige Punkte:

  • Ich habe Bilder in einem Ordner "000" und benannt "image ###". Zur Zeit habe ich Bilder mit Dateinamen von "image001" bis "image042"
  • Die Test-App hat einen Speicherbedarf von 6 MB, sobald die erste Seite komplett mit dem Bild angezeigt wird, und nach der Änderung der Seite auf fast 18-20 MB
  • Nachfolgende Seitenwechsel führen zu einer allmählichen Zunahme des Speichers und dann zu einem eventuellen Absturz, wenn die Anzahl der Bilder dies zulässt, andernfalls ist der Speicherverbrauch nach dem Durchlaufen aller Bilder konstant
  • Ich benutze .jpg Dateien mit ca. 1280 x 2000, zum Testen skaliere ich keine Bilder.

    
Master Chief 13.11.2012, 04:13
quelle

4 Antworten

6

Ich habe die gleiche Art von App, mit den nächsten / vorherigen Bildtasten. Und ich hatte genau das gleiche Speicherleck, was mich verrückt gemacht hat.

Ich war immer noch nicht in der Lage, die Ursache zu finden, aber ich konnte es mit einem hässlichen Hack umgehen. Bei der Anzeige des nächsten Bildes zwinge ich die alte Bildquelle dazu, ein ungültiges Bild zu laden, wodurch der Speicher freigegeben wird. Ich verstehe nicht, warum das Entfernen aller Referenzen und das Aufrufen des Garbage Collectors nicht genug ist, da muss irgendwo eine andere Referenz intern gespeichert werden.

Wie auch immer, hier ist der Hack:

%Vor%

Sie können es zum Beispiel in Ihrer RefreshImage -Methode aufrufen:

%Vor%

Schämt sich irgendwie, das zu benutzen, aber zumindest scheint es zu funktionieren.

    
Kevin Gosse 20.11.2012, 21:36
quelle
1

Ich habe Ihr Codebeispiel versucht, aber in Windows Phone 8 Umgebung und ich konnte das Leck nicht reproduzieren. Der einzige Unterschied ist, dass ich meine eigenen Bilder verwendet habe.

Der aktuelle Speicherverbrauch blieb bei meinem 512 WVGA Emulator bei 13 MB und der Peak blieb bei 14 MB. Ich habe den "nächsten Knopf" ungefähr 20 Mal gedrückt.

Haben Sie auch versucht, Bindings für ImageHolder zu verwenden, statt die Quelle manuell zu setzen?

(übrigens, ich sehe keine möglichen Speicherlecks in Ihrem Codebehind).

(Siehe auch diesen Artikel Ссылка )

    
Jevgeni Tsaikin 16.11.2012 08:18
quelle
1

Nach vielen Probeläufen und Debugging-Sitzungen habe ich festgestellt, dass dieses Zwischenspeichern von Bildern nicht ausgeführt wird (oder nicht so aggressiv durchgeführt wird), wenn Bilder im IsolatedStorage der App gespeichert sind.

Tatsache ist, dass ich die Bilder, die ein Teil der xap-Datei waren, als Inhalt verwendet habe. Ich habe das gemacht, weil ich nur meinen Bildbetrachter testen wollte. Aber das wäre nicht der Fall, wenn meine App fertig wäre. App wurde wirklich entworfen, um Bilder im isolierten Speicher zu speichern und sie anzuzeigen.

Also habe ich den notwendigen Code eingerichtet und voila, Bilder werden jetzt Müll gesammelt, obwohl sie noch zwischengespeichert wurden. Siehe Bild unten (siehe wie oft Garbage Collector aufgerufen wird). Das ist eine Lösung für eine nicht so triviale Frage, deshalb hat niemand sonst ein Problem dieser Art gesehen.

Ich glaube, wenn WP7 silverlight feststellt, dass Bilder nicht aus isoliertem Speicher stammen, nimmt er an, dass das Bild von einem Remote-URI stammt, und beschließt, es dennoch zwischenzuspeichern. Und hier kommt das Silverlight-Image-Caching-Problem ins Spiel. Wie eine andere Antwort bestätigt, geschieht dies nicht in WP8.

    
Master Chief 21.11.2012 06:02
quelle
0

Versuchen Sie diesen Ansatz: Image-Downloader mit automatischer Speicherbereinigung . Es ist ein fortschrittliches KooKiZ-Beispiel, das die Visualisierung unterstützt. Beispielprojekt ist hier: Ссылка

    
Vitalii Vasylenko 02.10.2013 19:39
quelle