Frage

Ich versuche, ein Speicherleck (s) in meiner Anwendung zu lösen. Ich habe heruntergeladen und lief RedGate der ANTS Memory Profiler 5.0 und der Speicher-Profiler sagt mir das Leck hat mit WeakReferences zu tun.

Das Problem, das ich in laufen lasse, ist, dass ich noch nie von einem WeakReference gehört habe, noch werden sie ausdrücklich in meiner Anwendung erklärt. Aus der Lektüre habe ich getan, was ich schwach Hinweis des glaube erstellt, wenn Sie ein Objekt / Ressource, die zerstört, aber kippe werden versucht, weil zu viele andere Objekte verweisen sie halten. Ich gehe davon aus der gleichen Art und Weise, dass eine Datei kann nicht gelöscht werden, da sie nach wie vor in Betrieb ist.

Also meine Frage ist, wie kann ich feststellen, wo diese schwachen Referenzen kommen aus? Ich habe den Verdacht, dass es könnte die Verwendung von ByRef sein? Ein anderer Kollege vorgeschlagen Hashtables.

Hoffnung, eine Klarstellung auf WeakReference Erkennung und Beseitigung und einige Klärung auf meinem Verdacht zu bekommen.

Danke.

War es hilfreich?

Lösung 3

Ich entdeckte meine WeakReferences wurden von der System.Diagnostics.TextWriterTraceListener Klasse geschaffen. Ich habe nicht noch meine Speicherleck behoben, und ich bin so tief in ihm Ich fange an zu fragen, ob ich einen Speicherverlust haben oder nicht, aber ich bin erleichtert zu wissen, wo die WeakReferences herkommen.

Danke an alle die posted

Andere Tipps

In den Kämpfen mit .NET Ressourcenlecks (Speicher / Griffe / Threads / etc) haben wir einen Schuldigen gefunden, die über allen anderen steigt: verweilenden Event-Handler. Wenn ich ein Objekt, würde Ich mag zu entsorgen, aber ich habe noch einen Event-Handler auf ein Ereignis des Objekts registriert haben, dann wird das Objekt wirklich nicht weg - diese Zombies vermehren und aneinanderzureihen in Ketten bis boom! Sie verwaltet App hat, was für alle Absichten und Zwecke ist eine Ressource Leck.

Wir haben die Schrotflinte Ansatz und scheuern unsere am häufigsten besucht werden und schwersten, Klassen für Veranstaltungen fügen wir sowohl manuell als auch mittels VB.NET des „Griffe“ keyword und sicherzustellen, dass RemoveHandler / - = für jeden aufgerufen während entsorgen. Wir verfügen auch ausdrücklich von so viel wie möglich.

ANTS ist ein großes Werkzeug dieser für das Aufspüren, aber es ist nicht ein einfaches Werkzeug (aber es ist die einfachste der Werkzeuge, die ich habe für diese Probleme zu finden). Verbringen Sie einige Zeit immer mit ihm vertraut, und wenn Sie auf Version sind 5 dann Verwendung dieser neuen Filter machen.

Leider gibt es keinen Königsweg, es ist einer meiner größten aggrivations mit .NET weil in der Regel wissen Sie nicht, dass Sie ein Problem haben, bis es schrecklich weit verbreitet und schwer zu regieren in.

WeakReference sollte nicht einen Speicherverlust verursachen . Es wäre ein Objekt verursacht gesammelt werden, aber immer noch eine Last-Minute-Option hast, um darauf zuzugreifen.

Ich habe nicht funktionierte das der Memory Profiler aber:

Alle meine Speicherlecks in NetcAnwendung haben mit Ereignissen / Delegierten zu tun.

Wenn Sie eine Methode hinzufügen, um ein Ereignis zu hören, erstellen Sie einen Verweis von dem Objekt, das das Ereignis (Stichwort) auf das Objekt enthält, das die Methode, die Sie aufrufen möchten hat.

Wenn alle anderen Verweise auf das Objekt, das die Methode enthält weg sind, könnte man denken, es wird gesammelt werden, aber es ist immer noch eine (unsichtbar) Referenz über das Ereignis.

Dieser Speicherverlust ist ein bekannter Fehler in dem .NET-Frameworks. __ENCList ist eine interne .NET-Klasse, die verwendet wird Bearbeiten zur Verfügung zu stellen und Funktionalität weiter. Die einzige Lösung für dieses Problem ist in Release-Modus neu zu kompilieren. (Was ist bedauerlich, wenn Sie den Debug-Modus waren mit Bericht detaillierter Ausnahme in Produktionsumgebungen bieten.)

http://support.microsoft.com/?kbid=919481

Moataz Computer Engineer

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top