Frage

Ich schrieb C ++ für 10 Jahre. Ich traf Gedächtnisprobleme, aber sie können mit vertretbarem Aufwand festgelegt werden.

Für den letzten paar Jahren habe ich C # geschrieben. Ich finde ich immer noch viele Speicherprobleme bekommen. Sie sind schwer zu diagnostizieren und zu beheben aufgrund des Nicht-determinancy, und weil die C # Philosophie ist, dass Sie sollen nicht über solche Dinge kümmern müssen, wenn Sie sehr auf jeden Fall tun.

Ein besonderes Problem ich finde, ist, dass ich explizit entsorgen und Bereinigung alles im Code. Wenn ich es nicht tun, dann müssen die Speicher Profiler helfen nicht wirklich, weil es so viel über dich Spreu schwebend ist, kann nicht ein Leck innerhalb aller Daten finden sie versuchen, Ihnen zu zeigen. Ich frage mich, ob ich die falsche Idee habe, oder wenn das Werkzeug, das ich habe ist nicht die beste.

Welche Strategien und Tools sind nützlich für Speicherlecks in .NET Bewältigung?

War es hilfreich?

Lösung

Ich verwende SciTechs MemProfiler , wenn ich ein Speicherleck vermuten.

Bisher habe ich es als sehr zuverlässig und leistungsstark sein. Es hat meinen Speck auf mindestens einmal gespeichert.

Die GC funktioniert sehr gut in .NET IMO, aber wie jede andere Sprache oder Plattform, wenn Sie schlechten Code schreiben, schlechte Dinge passieren.

Andere Tipps

Nur für das Vergessens-to-dispose Problem, versuchen der Lösung in diesem Blog-Eintrag beschrieben. Hier ist die Essenz:

    public void Dispose ()
    {
        // Dispose logic here ...

        // It's a bad error if someone forgets to call Dispose,
        // so in Debug builds, we put a finalizer in to detect
        // the error. If Dispose is called, we suppress the
        // finalizer.
#if DEBUG
        GC.SuppressFinalize(this);
#endif
    }

#if DEBUG
    ~TimedLock()
    {
        // If this finalizer runs, someone somewhere failed to
        // call Dispose, which means we've failed to leave
        // a monitor!
        System.Diagnostics.Debug.Fail("Undisposed lock");
    }
#endif

Wir haben verwendet Ants Profiler Pro von Red Gate Software in unser Projekt. Es funktioniert wirklich gut für alle .NET-Sprache-basierten Anwendungen.

Wir fanden, dass das .NET Garbage Collector ist sehr „sicher“ in seiner Säuberung der von der In-Memory-Objekte (wie es sein sollte). Es wäre Objekte herum halten, nur weil wir Macht werden sie irgendwann in der Zukunft verwenden. Dies bedeutete, dass wir vorsichtiger über die Anzahl der Objekte sein mussten, die wir in Erinnerung aufgeblasen. Am Ende umgewandelt wir alle unsere Datenobjekte über zu einem „aufblasen on-demand“ um (kurz vor einem Feld angefordert wird) Speicher zu reduzieren Aufwand und die Leistung steigern.

EDIT: „auf Nachfrage aufblasen“ Hier ist eine weitere Erklärung dessen, was ich damit meine In unserem Objektmodell unserer Datenbank verwenden wir Eigenschaften von einem übergeordneten Objekt, das Kind Objekt (e) verfügbar zu machen. Zum Beispiel, wenn wir haben einige Datensatz, der ein anderes „Detail“ oder „Nachschlag“ Aufzeichnung auf einer Eins-zu-eins-Basis verwiesen wir es so strukturieren würden:

class ParentObject
   Private mRelatedObject as New CRelatedObject
   public Readonly property RelatedObject() as CRelatedObject
      get
         mRelatedObject.getWithID(RelatedObjectID)
         return mRelatedObject
      end get
   end property
End class

Wir fanden, dass das oben genannte System einige echte Speicher und Performance-Probleme entstehen, wenn es eine Menge von Datensätzen in Erinnerung waren. So wechselten wir auf ein System über, wo Objekte nur aufgeblasen wurden, als sie aufgefordert wurden, und Datenbankaufrufe wurden nur gemacht, wenn notwendig:

class ParentObject
   Private mRelatedObject as CRelatedObject
   Public ReadOnly Property RelatedObject() as CRelatedObject
      Get
         If mRelatedObject is Nothing
            mRelatedObject = New CRelatedObject
         End If
         If mRelatedObject.isEmptyObject
            mRelatedObject.getWithID(RelatedObjectID)
         End If
         return mRelatedObject
      end get
   end Property
end class

Dies erwies sich als wesentlich effizienter zu sein, weil Objekte aus dem Speicher gehalten wurden, bis sie gebraucht wurden (die Get-Methode zugegriffen wurde). Es bot eine sehr große Leistungssteigerung in der Datenbank Hits und einen großen Gewinn an Speicherplatz zu begrenzen.

Sie müssen noch über den Arbeitsspeicher machen, wenn Sie verwalteten Code schreiben, es sei denn, Ihre Anwendung trivial ist. Ich werde zwei Dinge vorschlagen: Erstens, lesen CLR via C # , weil es hilft Ihnen, die Speicherverwaltung in .NET verstehen. Zweitens lernen, ein Tool wie CLRProfiler verwenden (Microsoft). Dies kann Ihnen eine Vorstellung davon, was Ihre Speicherleck verursacht (z Sie einen Blick auf Ihre große Objekt Heapfragmentierung dauern kann)

Verwenden Sie nicht verwalteten Code? Wenn Sie nicht verwalteten Code verwenden, nach Microsoft, Speicherlecks im herkömmlichen Sinne sind nicht möglich.

Speicher durch eine Anwendung verwendet, jedoch nicht gelöst werden können, so dass eine Speicherzuweisung der Anwendung kann während der gesamten Lebensdauer der Anwendung wachsen.

  

Wie Speicherlecks in der Common Language Runtime auf Microsoft.com

     

Ein Speicherverlust kann in einer .NET auftreten   Framework-Anwendung, wenn Sie verwenden   nicht verwalteten Code als Teil der   Anwendung. Diese nicht verwalteten Code kann   Leck-Speicher, und das .NET Framework   Laufzeit kann nicht das Problem lösen.

     

Zusätzlich kann ein Projekt nur   erscheint ein Speicherleck zu haben. Diese   Bedingung kann auftreten, wenn viele große   Objekte (wie Table-Objekte)   deklariert und dann zu einem hinzugefügt   Sammlung (wie ein Datensatz). Das   Ressourcen, die diese Objekte besitzen können   nie veröffentlicht, und die Ressourcen werden   ist für den gesamten Lauf am Leben von   das Programm. Dies scheint eine zu sein   Leck, aber eigentlich ist es nur ein   Symptom der Art und Weise, dass der Speicher ist   wobei im Programm zugeordnet.

Für diese Art von Problem zu tun, können Sie implementieren IDisposable . Wenn Sie einige der Strategien für den Umgang mit Speicherverwaltung sehen wollen, würde ich die Suche vorschlagen IDisposable, XNA, Speicherverwaltung als Spiel brauchen Entwickler berechenbare Garbage Collection haben und so müssen die GC erzwingen nicht sein Ding.

Ein häufiger Fehler ist es, nicht Event-Handler zu entfernen, die auf ein Objekt zu abonnieren. Ein Event-Handler Abonnement wird ein Objekt aus dem Recycling verhindern. Werfen Sie auch einen Blick auf die mit Aussage, die können Sie einen begrenzten Spielraum für eine Ressource Lebenszeit erstellen.

Dieser Blog hat einige wirklich wunderbare Lösungen windbg und andere Werkzeuge aller Art aufzuspüren Speicherlecks aus. Ausgezeichnete Lesen Sie Ihre Fähigkeiten zu entwickeln.

Ich hatte gerade ein Speicherleck in Windows-Dienst, dass ich festgelegt.

Zuerst habe ich versucht, MemProfiler . Ich fand es wirklich schwer zu bedienen und überhaupt nicht benutzerfreundlich.

Dann habe ich JustTrace , die einfacher zu bedienen ist und gibt Sie weitere Informationen über die Objekte, die nicht richtig angeordnet sind.

Das hat mir erlaubt den Speicherverlust wirklich leicht zu lösen.

Wenn die undichten Stellen Sie beobachten zu einer Implementierung außer Kontrolle geratenen Cache zurückzuführen sind, ist dies ein Szenario, in dem Sie könnte die Verwendung von WeakReference zu betrachten. Dies könnte dazu beitragen, sicherzustellen, dass der Speicher freigegeben wird, wenn notwendig.

Allerdings IMHO wäre es besser, eine maßgeschneiderte Lösung zu betrachten - nur wissen Sie wirklich, wie lange Sie die Objekte in der Umgebung halten müssen, so geeigneten Housekeeping Code Gestaltung für Ihre Situation in der Regel der beste Ansatz ist

.

Big guns - Debugging Tools für Windows

Dies ist eine erstaunliche Sammlung von Werkzeugen. Sie können sowohl verwaltete und nicht verwaltete Haufen mit ihm analysieren und man kann es offline tun. Das war sehr praktisch für einen unserer ASP.NET-Anwendungen debuggen, die Recyclingübernutzung aufgrund Speicher gehalten. Ich hatte nur ein vollständiges Speicherabbild lebenden Prozess zu schaffen, auf dem Produktionsserver ausgeführt wird, wurde alles getan Analyse offline in WinDbg. (Es stellte sich heraus, einige Entwickler wurde überbeanspruchend Session Speicherung im Speicher.)

"Wenn gebrochen ist ..." Blog sehr nützlichen Artikel hat auf das Thema.

Das Beste, was im Auge zu behalten ist, den Überblick über die Verweise auf Ihre Objekte zu halten. Es ist sehr einfach, um am Ende mit Referenzen zu Objekten hängen, die Sie nicht mehr nicht kümmern. Wenn Sie etwas nicht gehen mehr zu verwenden, es loszuwerden.

Lassen Sie sich bei Verwendung eines Cache-Provider mit Schiebe Exspirationen verwendet, so dass, wenn etwas nicht für ein gewünschtes Zeitfenster bezeichnet es dereferenziert wird und gereinigt. Aber wenn es eine Menge zugegriffen wird es im Speicher sagen.

Eines der besten Tools wird mit der adplus > Debugging tools für Windows , und ein Speicherabbild des Prozesses nehmen, dann stark mit <> windbg und die sos Plugin analysieren die Prozessspeicher, Threads und Stapeln nennen.

Sie können diese Methode auch zur Identifizierung von Problemen auf Servern verwenden können, nachdem die Werkzeuge zu installieren, das Verzeichnis gemeinsam nutzen, dann auf die Freigabe von dem Server verbinden mit (net use) und entweder einem Absturz nehmen oder Dump des Prozesses hängen.

Dann offline analysiert werden.

Nach einem meiner Fixes für verwaltete Anwendung ich die gleiche Sache hatte, wie, wie Sie sicherstellen, dass meine Bewerbung nicht das gleiche Speicherleck nach meiner nächsten Änderung hat, also habe mich so etwas wie Gegenstand Release Verification Framework geschrieben, bitte nimm ein Blick auf die NuGet Paket ObjectReleaseVerification . Sie können eine Probe finden hier https://github.com/outcoldman/OutcoldSolutions-ObjectReleaseVerification-Sample, und Informationen über diese Probe http://outcoldman.ru/en/blog/show/322

Ich ziehe dotmemory von Jetbrains

Von Visual Studio 2015 betrachten aus der Box verwenden Speichernutzung Diagnose-Tool zu sammeln und Speichernutzungsdaten zu analysieren.

Die Speichernutzung Tool können nehmen Sie einen oder mehrere Schnappschüsse des verwalteten und nativen Heap-Speicher, um die Speicherauslastung Auswirkungen von Objekttypen zu verstehen.

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