Was sind die Möglichkeiten zur Lösung von Speicherlecks in C#
Lerne ich C#. Von dem was ich weiß, Sie haben die Dinge richtig zu haben, der garbage collector tatsächlich alles löschen, wie es sein sollte. Ich bin auf der Suche nach Weisheit über die Jahre gelernt von Ihnen, der intelligente.
Komme ich aus einer C++ - hintergrund und bin SEHR verwendet, um code-smells und Entwicklung Muster. Ich will lernen, was code-smells sind wie in C#. Mir einen Rat geben!
Was sind die besten Möglichkeiten, um Dinge gelöscht?
Wie kannst du herausfinden, wenn du "memory leaks"?
Edit: ich versuche zu entwickeln, die ein Schlag-Liste der "Sachen immer für memory management"
Danke, so viel.
InformationsquelleAutor Jeremiah | 2009-03-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
C#, dem .NET Framework verwendet, Verwaltet Speicher und alles (aber zugeteilt, nicht verwaltete Ressourcen) Müll gesammelt.
Es ist davon auszugehen, dass die verwalteten Typen sind immer Müll gesammelt. Das schließt
arrays
,classes
undstructures
. Fühlen Sie sich frei, zu tunint[] stuff = new int[32];
und vergessen Sie es.Wenn Sie eine Datei öffnen, die Datenbank-Verbindung, oder andere nicht verwaltete Ressource in einer Klasse, die IDisposable-Schnittstelle implementieren und sich in Ihrer Dispose-Methode de-allocate der nicht verwalteten Ressource.
Jede Klasse, die IDisposable implementiert, sollte explizit geschlossen werden, oder in einem (finde ich cool) Mit block wie;
Hier .NET entsorgen Leser, wenn aus der { } scope.
Guter Punkt. Also das mit der Klasse ist Müll gesammelt, aber es ist Ressourcen, sind ausdrücklich freigegeben. Darüber habe ich nie nachgedacht.
"Es ist davon auszugehen, dass die verwalteten Typen sind immer Müll gesammelt." Diese Aussage ist so falsch. Nichts ist Müll gesammelt, wenn es noch erreicht werden kann, muss der Programmierer immer noch im Hinterkopf haben, zunichte sein/Ihr root-Referenzen, wenn Sie nicht mehr benötigt werden.
InformationsquelleAutor Dead account
Das erste, was mit GC ist, dass es nicht-deterministisch, wenn Sie wollen, eine Ressource, die prompt aufgeräumt, implementieren
IDisposable
und verwendenusing
; die, die nicht sammeln Sie den verwalteten Speicher, kann aber helfen, eine Menge mit nicht verwalteten Ressourcen und den weiteren Ketten.Insbesondere Dinge zu achten:
Für die Untersuchung von memory-leaks... "SOS" ist eine der einfachsten Routen, die Sie verwenden können, SOS-finden aller Instanzen von einem Typ, und was es sehen kann, etc.
InformationsquelleAutor Marc Gravell
Im Allgemeinen, desto weniger Sie sich sorgen über die Speicherreservierung in C#, das bessere Weg von Ihnen sind. Ich würde es auf einen profiler, um mir zu sagen, wenn ich Probleme mit der Sammlung.
Können Sie nicht erstellen Sie Speicherlecks in C# in der gleichen Weise, wie Sie in C++. Der garbage collector wird immer "haben Rücken". Was Sie tun können, ist, die Objekte erstellen, und Verweise auf Sie, obwohl Sie nie verwenden. Das ist ein code smell zu suchen.
Andere als das:
using
syntax)InformationsquelleAutor Michael Meadows
Den wichtigsten Ursachen von Speicherlecks ich denken kann, sind:
halten Referenzen auf Objekte, die Sie nicht mehr benötigen (in der Regel in einer Art collection), So dass hier müssen Sie daran denken, dass alle Dinge, die Sie hinzufügen, um eine Sammlung, die Sie haben-Referenz zu bleiben im Speicher.
Dass zirkuläre Referenzen, z.B. Delegierte registriert ein Ereignis. So, obwohl Sie explizit nicht auf ein Objekt verweisen, kann es nicht mehr Müll gesammelt, weil eine seiner Methoden ist registriert als Delegierter, mit einem Ereignis. In diesen Fällen müssen Sie daran denken, um die zu entfernen delegieren, bevor Sie Sie verwerfen die Referenz.
InformationsquelleAutor Grzenio
Eine andere Sache zu prüfen, für die Verwaltung des Speichers ist, wenn Sie die jeden Beobachter der Muster und nicht die Entsorgung der Verweise korrekt.
Zum Beispiel:
Objekt Ein Uhren-Objekt B
Objekt B wird freigegeben, wenn die Referenz von A zu B ist nicht entsorgt Eigentum, das die GC nicht properyly entsorgen Sie das Objekt. Weil die event-handler noch zugeordnet die GC nicht sehen es als eine nicht eingesetzten Ressource.
Wenn Sie eine kleine Menge von Objekten Sie arbeiten, kann mich irrelevant. Allerdings, wenn Sie Ihre Arbeit mit tausenden von Objekten, dies kann zu einem allmählichen Anstieg der Speicher über die Lebensdauer der Anwendung.
Gibt es einige große Speicher-management-software-Anwendungen zu überwachen, was Los ist mit dem heap der Anwendung. Ich fand toll, profitieren von der Nutzung .Net Memory Profiler.
HTH
InformationsquelleAutor
Empfehle ich .NET Memory Profiler
.NET Memory Profiler ist ein leistungsfähiges tool zum Auffinden von memory-leaks und die Optimierung der Speichernutzung in Programmen, die in C# geschrieben, VB.NET oder jede andere .NET-Sprache.
.NET Memory Profiler helfen Ihnen:
Werfen Sie einen Blick auf Ihre video-tutorials:
http://memprofiler.com/tutorials/
InformationsquelleAutor Konstantin Tarkus
Andere haben bereits erwähnt, wie wichtig das IDisposable, und einige der Dinge zu achten, die in Ihrem code.
Wollte ich vorschlagen, einige zusätzliche Ressourcen; ich fand die folgenden unschätzbarem Wert, wenn das erlernen der details der .NETTO GC und wie trouble-Shooting-Speicher Probleme .NET-Anwendungen.
CLR via C# von Jeffrey Richter ist ein ausgezeichnete Buch. Lohnt sich der Kauf-Preis nur für das Kapitel über die GC und Speicher.
Diese blog (von Microsoft "ASP.NET Escalation Engineer") ist oft meine go-to-Quelle für Tipps und tricks für die Verwendung von WinDbg, SOS, und für das Auffinden bestimmter Arten von memory leaks. Tess selbst gestaltet .NET debugging demos/labs, die gehen mit Ihnen durch gemeinsamen Speicher Probleme und wie man Sie erkennt und zu lösen.
Debugging Tools für Windows (WinDbg, SOS, etc)
InformationsquelleAutor
Können Sie tools wie CLR-profiler es dauert einige Zeit, um zu lernen, wie es richtig zu verwenden, aber es ist kostenlos. (Es hat mir geholfen, mehrere Male zu finden, meine Erinnerung Leckage)
InformationsquelleAutor bezieur
Der beste Weg, um sicherzustellen, dass Objekte gelöscht werden, oder in .NET lingo-Code, garbage Collection, ist, um sicherzustellen, dass alle root-Referenzen (Verweise zurückverfolgt werden kann durch die Methoden und Gegenstände der ersten Methode auf einem thread-Aufruf-stack), um ein Objekt auf null gesetzt.
Den GC kann nicht und wird nicht, sammeln Sie ein Objekt, ob es irgendwelche verwurzelt Verweise auf Sie, egal, ob es IDisposable implementiert oder nicht.
Zirkuläre Verweise verhängen keine Strafe oder die Möglichkeit der Speicherverluste, da die GC-marks, die Objekte, die er besucht hat, in das Objektdiagramm. Im Fall des Delegierten-oder Event-Handler kann es üblich sein, zu vergessen, entfernen Sie den Verweis in einem Fall zu einer target-Methode, so dass das Objekt, das das Ziel enthält, können Sie die Methode nicht erfasst werden, wenn das Ereignis verwurzelt ist.
InformationsquelleAutor Cecil Has a Name
HINWEIS: das folgende funktioniert nur für die Arten mit nicht verwalteten Ressourcen. Es hilft nicht mit rein verwalteten Typen.
Wahrscheinlich die beste Methode ist die Umsetzung und Folgen, die die IDisposable-pattern; und rufen Sie die dispose-Methode für alle Objekte implementieren.
Den 'über' - Anweisung ist dein bester Freund. Locker ausgedrückt, es wird der Aufruf von dispose für Sie auf Objekte, die IDisposable implementieren.
InformationsquelleAutor user79755