2008-10-22 12 views
27

Ich könnte einige Hinweise zum Aufspüren der Ursache von Speicherlecks in C# verwenden. Ich verstehe, was ein Speicherleck ist, und ich verstehe, warum sie in C# auftreten, aber ich frage mich, welche Tools/Strategien du in der Vergangenheit benutzt hast, um sie zu lösen?Speicherlecks in C# WPF

Ich benutze .NET Memory Profiler und ich habe festgestellt, dass eines meiner großen Hauptobjekte im Speicher bleibt, nachdem ich das Fenster schließe, das es verwaltet, aber ich bin nicht sicher, was zu tun ist, um alle Links zu ihm zu schränken.

Wenn ich nicht klar genug bin, poste einfach eine Antwort mit einer Frage und ich bearbeite meine Frage als Antwort. Vielen Dank!

+0

versuchen Sie auch die Ants Memory Profiler, wie es zeigt, dass Objekte auf ein bestimmtes Objekt zeigt –

Antwort

39

Pause in den Debugger und diese dann geben Sie in das Direktfenster:

.load C:\Windows\Microsoft.NET\Framework\v2.0.50727\sos.dll 

Der Pfad variiert Sos.dll. Um den richtigen Pfad herauszufinden, suchen Sie im Bereich Module nach mscorwks.dll. Wohin das auch geladen wird, ist der richtige Pfad für sos.dll.

dieses Geben Sie dann:

System.GC.Collect() 

dass alles, was nicht erreichbar gesammelt gewährleisten. Dann geben Sie Folgendes ein:

!DumpHeap -type <some-type-name> 

Dies zeigt Ihnen eine Tabelle aller vorhandenen Instanzen mit Adressen. Sie können herausfinden, was wie diese eine Instanz am Leben halten:

!gcroot <some-address> 
+0

Ich musste System.GC.Collect() verwenden, um Garbage Collection zu arbeiten. – nash

+0

Ich denke, das kann davon abhängen, wo der Debugger gestoppt hat, wenn Sie darin einbrechen. Ich werde meine Antwort korrigieren, damit es funktioniert. –

8

.NET Memory Profiler ist ein ausgezeichnetes Werkzeug, und eine, die ich häufig Speicherlecks in WPF-Anwendungen zu diagnostizieren verwenden.

Wie Sie sicher wissen, ist es eine gute Methode, einen Schnappschuss zu machen, bevor Sie eine bestimmte Funktion verwenden, dann einen zweiten Schnappschuss zu machen, nachdem Sie das Fenster geschlossen haben Snapshots können Sie sehen, wie viele Objekte eines bestimmten Typs zugewiesen, aber nicht freigegeben werden: Dies ist ein Leck.

Nach einem Doppelklick auf einen Typ zeigt der Profiler die kürzesten Pfade an, die Objekte dieses Typs am Leben erhalten. Es gibt viele verschiedene Möglichkeiten, wie .NET-Objekte in WPF auslaufen können. Daher sollte das Veröffentlichen des angezeigten Stammpfads dazu beitragen, die ultimative Ursache zu ermitteln. Versuchen Sie jedoch im Allgemeinen zu verstehen, warum diese Objekte Ihr Objekt festhalten, und sehen Sie, ob Sie Event-Handler, Bindungen usw. lösen können, wenn das Fenster geschlossen wird.

Ich habe vor kurzem eine blog entry über eine bestimmte memory leak, die durch bestimmte Bindungen verursacht werden kann, gepostet; Für diese speziellen Arten von Lecks ist der Code dort nützlich, um die fehlerhafte Bindung zu finden.