WPF Memory Nutzung
Anwendung:
- WPF-Anwendung, bestehend aus einer textbox auf top und eine listbox unten
- Benutzer geben Sie eine Zeichenfolge in das Textfeld, um Mitarbeiter suchen, und die Suchergebnisse angezeigt werden in der ListBox
- ListBox verwendet DataTemplates zur Anzeige Elemente (zeigt die Mitarbeiter-name, Abteilung, Telefon und ein thumbnail-Bild.)
Umsetzung:
- Beim Start der Anwendung habe ich die Datenbank Abfragen und abrufen aller Mitarbeiter und die damit verbundenen Informationen angezeigt werden in der ListBox. Dies ist im Speicher gehalten die ganze Zeit.
- Nach dem Start der Anwendung werden alle durchsuchbaren Daten in den Speicher und sucht sind praktisch augenblicklich. Alle Suchvorgänge werden durchgeführt, auf der bereits Daten im Speicher.
- Suchergebnisse angezeigt werden in der ListBox mit DataTemplates. Miniaturansicht, Bild, name, Telefon, Abteilung, etc, sind in jedem ListBox-Element.
Problem:
- Beim Start die Speicherauslastung ist über 200MB.
- Als änderung der Daten in das Listenfeld, die entweder über eine neue Suche oder einfach nach unten scrollen die listbox, die Speicherauslastung erhöht.
- Wenn Benutzer einen Bildlauf durch das Listenfeld langsam, Speicher schneller. Wie Sie Blättern Sie nach oben und unten Speicher erreicht schnell 1 GB.
Gibt es keinen code erstellen-Steuerelemente manuell - alles erfolgt über data binding.
Warum sehe ich dieses Verhalten? Was kann ich tun, um es zu beheben? Bitte um Hilfe!!
UPDATE:
Ich habe herausgefunden, dass das problem nicht ein memory-leak. Das Problem hier ist, dass die listbox erstellen von Objekten für die Anzeige der Bilder des Mitarbeiters und ist nicht frei für den garbage collector nach dem listboxitem steigt aus dem Fenster. Die CleanUpVirtualizedItem Ereignis Auftritt, wie ich erwartet hatte, aber der Speicher ist noch nicht veröffentlicht. Irgendwelche Ideen?
- Naja, eigentlich "istbox ist die Erstellung von Objekten für die Anzeige der Bilder des Mitarbeiters und ist nicht frei für den garbage collector nach dem listboxitem wird aus dem Fenster" - ist ein Speicher-Leck
- Dies ist nur Semantik und es macht keinen Unterschied, aber wenn Sie haben ein Objekt und das Objekt den Speicher, dies ist keinen Speicherverlust. Ein Leck wäre, wenn das Objekt Weg ist und der Speicher noch reserviert, zum Beispiel.
- oh, vielleicht hast du Recht, aber diese definition passt wohl nur für nicht verwalteten code. ich habe zwar gesehen, in der .NET-Welt, wie zum Beispiel die Definitionen von einem Speicherleck.
InformationsquelleAutor Gus Cavalcanti | 2009-05-08
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dem Risiko ausgesetzt, dass glib, haben Sie einen Speicherverlust. Warum nicht versuchen, ein tool wie AMEISEN* es aufspüren. Sie haben eine Kostenlose Testversion, ich habe noch nie verwendet, aber es hat einen guten Ruf.
*Weitere profiling-tools zur Verfügung stehen.
Wenn Sie nicht wollen, um sich mit einem anderen tool, können Sie versuchen, so etwas wie das Inkrementieren einer statischen member-jedes mal, wenn eine Klasse erstellt wird und Dekrementieren es jedes mal, wenn eine Instanz ist entsorgt. Dies wird Ihnen helfen, die Spur zu Instanzen, die nicht zerstört werden richtig.
LOL Start 200MB und 1GB laufen.. Mehr gemeinsame Strafe auf x64 (und Sie müssen es für aufblähen) ist eine Strafe von rund 64 MB für den Start und ein weiterer 120MB für semi-erweiterte Funktionalität, die ist immer noch riesig und natürlich GC halten Sie das hinzufügen mehr.
Dass gotta kill die CPU und alle Peripherie um ihn herum in kürzester Zeit. Nun Stell dir vor, alles läuft, alle apps und das gesamte OS und stack (als VS2010 wird sicherlich versuchen, etwas in diese Richtung zu bewegen).
Ich würde sagen: willkommen in der modernen Form von bloatware mania und seine einfache Zugänglichkeit. Egal, was Sie tun, werden Sie verbringen mehr Zeit auf der Suche nach workarounds dann folgenden einige "universal" - framework, um schnell und cool und gut gestaltet und anpassbare apps. Sicher WPF ist gut auf dem Papier, sondern eine Verschwendung von Ressourcen, die in jedem praktischen Einsatz (Tonnen von Ressourcen und eine steile Lernkurve).
Und Sie sagte, es war und immer noch ist die Zukunft (gleich für JDK-apps, die ach-so-verbreitet).
Einfach N. U. T. S + die meisten ausgezeichnetes Beispiel, dass es nicht um die Geschwindigkeit (als CLR-Verteidiger springt mit trivialen Beispielen) von verwaltetem code. Es ist über große Skalierbarkeit impairement und Maschine wipeout als mit jedem GC und die Objekt-root-Umgebung gibt.
Stimme runter kommen.. gehen auf die jünger, Sie wissen, Sie wollen.
(und schreiben an Obama gegen die CO2-Reduzierung, das wird nicht passieren; vielleicht vermehren sich durch 1003120x wenn, der Zug hält so, wie es ist. Auch eine Cray Jaguar wäre nicht auf diese Art von Betriebssystem-Umgebung, die jederzeit in den nächsten 20 Jahren ).
Könnten Sie
WPF Performance Suite
Optimizing WPF Application Performance
Einem ähnlichen Problem verfolgt mich.. (so etwas wie)
Beim Start der Anwendung habe ich die Datenbank Abfragen und abrufen aller Mitarbeiter und die damit verbundenen Informationen angezeigt werden in der ListBox. Dies ist im Speicher gehalten die ganze Zeit.
Vielleicht könnte man den code so ändern, Folgen Sie WPF: Data Virtualization
Es scheint wirklich der Speicher undicht. Wahrscheinlich werden einige der UI-Elemente in der DataTemplate halten Referenzen auf andere Objekte, die sollte am Leben bleiben, auch wenn das UI-element ist zerstört.
Könnte es einige Speicher-Lecks mit Image control. Versuchen Sie, es zu entfernen aus der Vorlage und das Ergebnis sehen. Auch Sie sind abonnieren alle Veranstaltungen in controls Geladen Ereignisse oder sowas in der Art?
Nur einige Vermutungen, aber... Wie die Leute schon sagten, hier könnten Sie wirklich wollen, schauen Sie sich Ihre app auf performance-und memory-Profiler.
Habe ich bemerkt, dass es einige Fragen gibt, die in WPF-und .NET 3.5 SP1 w.r.t-memory-Probleme, die in scheinbar harmlosen Situationen.
Ich habe ein paar Ressourcen, aber ich bin nicht sicher, Sie würde Ihnen hilfreich sein:
http://blog.ramondeklein.nl/?p=58
Dass blog-post beschreibt eine situation, woraufhin, wenn
Kurz gesagt, ich denke, deine Lösung wäre es, sicherzustellen, dass alle Medien Effekte (Schlagschatten etc.) verwenden statische Ressourcen.
Eine Sache, die mir viel geholfen, war die Verwendung einer Klasse Verpackung der Stream-Klasse. Dies wird im detail erläutert hier und sicher genug ich viel Speicher gespart durch die Nutzung dieser Methode. WPF wirklich hält die Referenz auf das zugrunde liegende byte[] und Strom für jedes Bild.