shopfreephoenix.com

  

Beste Artikel:

  
Main / So vermeiden Sie Systemausfälle in c #

So vermeiden Sie Systemausfälle in c #

3. Januar 2019 C 11. Jeder, der an einem großen Unternehmensprojekt gearbeitet hat, weiß, dass Speicherlecks wie Ratten in einem großen Hotel sind. Sie werden es vielleicht nicht bemerken, wenn es nur wenige von ihnen gibt, aber Sie müssen immer auf der Hut sein, falls sie überfüllt sind, in die Küche einbrechen und auf alles kacken. Das Finden, Reparieren und Lernen, um Speicherlecks zu vermeiden, ist eine wichtige Fähigkeit. NET-Entwickler, die mich für diesen Artikel beraten haben. In einer Müllsammelumgebung ist der Begriff Speicherlecks etwas kontraintuitiv. Hierfür gibt es zwei verwandte Hauptursachen.

Die erste Hauptursache ist, wenn Sie Objekte haben, auf die noch verwiesen wird, die jedoch effektiv nicht verwendet werden. Dies kann beispielsweise passieren, wenn Sie sich bei Ereignissen registrieren, die Registrierung jedoch nie aufheben. Das ist nicht so schwer zu machen. NET selbst verfügt über viele Klassen, die nicht verwalteten Speicher zuweisen. Fast alles, was Streams, Grafiken, das Dateisystem oder Netzwerkaufrufe betrifft, tut dies unter der Haube. Sie können nicht verwalteten Speicher einfach selbst mit speziellen zuweisen.

Das Fenster Diagnosetools kann jedoch sehr nützlich sein. Speicherlecks und GC-Druck. Sie können an den gelben Linien von oben erkennen, dass der GC versucht, Speicher freizugeben, aber immer weiter ansteigt. GC-Druck tritt auf, wenn Sie neue Objekte erstellen und zu schnell entsorgen, als dass der Müllsammler mithalten könnte. Wie Sie auf dem Bild sehen, befindet sich der Speicher nahe an seiner Grenze und die GC-Bursts sind sehr häufig. In Enterprise Visual Studio enthält das Diagnosefenster auch einen integrierten Speicherprofiler, mit dem das spezifische Leck gefunden werden kann.

Der zweitleichteste Weg, um größere Speicherverlustprobleme zu erkennen, ist der Task-Manager oder der Prozess-Explorer von SysInternals. Diese Tools können die Menge an Speicher anzeigen, die Ihr Prozess verwendet. Wenn es im Laufe der Zeit konstant zunimmt, liegt wahrscheinlich ein Speicherverlust vor. PerfMon ist etwas schwieriger zu verwenden, kann jedoch eine schöne grafische Darstellung Ihrer Speichernutzung im Laufe der Zeit anzeigen. Beachten Sie, dass diese Methode notorisch unzuverlässig ist. Schließlich könnten Sie Speicherlecks mit GC-Druck verwechseln.

Die großen Namen in. NET-Speicherprofiler sind: Alle Speicherprofiler arbeiten auf ähnliche Weise. Sie können entweder eine Verbindung zu einem laufenden Prozess herstellen oder eine Dump-Datei öffnen.

Sie können sehen, wie viele Instanzen jedes Typs zugewiesen sind, wie viel Speicher sie benötigen und wie der Referenzpfad zu einem GC-Stamm lautet. Die schnellste und nützlichste Profilerstellungstechnik besteht darin, zwei Snapshots zu vergleichen, bei denen der Speicher in den gleichen Zustand zurückkehren soll.

Der erste Schnappschuss wird vor einer Operation erstellt, und ein weiterer Schnappschuss wird nach der Operation erstellt. Die genauen Schritte sind: NET Sie sollten wissen, dass ich eine Technik gezeigt habe, um einen Speicherverlust zu finden, indem ich einen Haltepunkt in die Klasse Finalizer gesetzt habe. Angenommen, Sie vermuten, dass eine bestimmte Klasse einen Speicherverlust aufweist. Mit anderen Worten, Sie vermuten, dass diese Klasse nach dem Ausführen eines bestimmten Szenarios referenziert bleibt und vom GC nie erfasst wird.

Gehen Sie folgendermaßen vor, um herauszufinden, ob der GC es tatsächlich gesammelt hat: Wenn null zurückgegeben wird, hat der GC Ihr Objekt erfasst. Wenn nicht, liegt ein Speicherverlust vor. Sie können die Speicherbereinigung am Ende erzwingen, indem Sie die magischen Linien in das unmittelbare Fenster eingeben. Dadurch wird diese Technik zu einem vollständigen Debugging-Erlebnis, ohne dass Code geändert werden muss. Ich empfehle, bei der Verwendung besonders vorsichtig zu sein und mit Techniken wie der letzten bewährten Methode proaktiv nach Speicherlecks zu suchen.

Die NET-Anwendung verwendet ständig nicht verwaltete Ressourcen. Jedes Mal, wenn Sie beispielsweise Streams, Grafiken oder Dateien verwenden, führen Sie wahrscheinlich nicht verwalteten Code aus. NET-Framework-Klassen, die nicht verwalteten Code verwenden, implementieren normalerweise IDisposable. Ihre einzige Aufgabe ist es, sich die Dispose-Methode zu merken und aufzurufen. Wenn möglich, verwenden Sie dazu die using-Anweisung. NET-Klassen verwenden das Dispose-Muster. Ziel dieses Musters ist es, eine explizite Entsorgung von Ressourcen zu ermöglichen.

Der GC. SuppressFinalize dies ist auch wichtig. Objekte mit Finalisierern werden unterschiedlich freigegeben und sind viel teurer. Der Finalizer wird der sogenannten F-Reachable-Queue hinzugefügt, wodurch das Objekt eine zusätzliche GC-Generation überlebt.

Es gibt auch andere Komplikationen. Manchmal möchten Sie möglicherweise Ihre Speichernutzung regelmäßig protokollieren. Möglicherweise vermuten Sie, dass auf Ihrem Produktionsserver ein Speicherverlust aufgetreten ist. Vielleicht möchten Sie etwas unternehmen, wenn Ihr Gedächtnis eine bestimmte Grenze erreicht.

Das Verwenden des aktuellen Speichers ist so einfach wie: Sie können jedoch noch tiefer gehen. Mit Runtime können Sie Ihren aktuellen Speicherheap überprüfen und mögliche Informationen abrufen. Sie können beispielsweise alle zugewiesenen Typen im Speicher drucken, einschließlich der Anzahl der Instanzen, der Pfade zu den Roots usw.

Sie haben so ziemlich einen Speicherprofiler aus Code. All diese Informationen können in einer Datei oder noch besser in einem Telemetrietool wie Application Insights protokolliert werden. Jedes Feedback ist willkommen. Einige gute Techniken, aber die Grundlagen sind [meiner beruflichen Meinung nach] fehlerhaft.

Jetzt stimme ich zu, dass längere als beabsichtigte Lebenszyklen enorme und unnötige Speicheranforderungen verursachen können, und in vielen Fällen [nachdem Messungen auf Systemebene durchgeführt wurden, um festzustellen, ob es tatsächlich Auswirkungen auf die Leistung gibt] muss dies behoben werden. Wenn Sie sich jedoch auf die Elemente konzentrieren, die als Lecks eingestuft wurden, werden Sie nicht einmal die größten Schuldigen sehen!

Mein Anspruch ist, dass in. Größerer Speicherbedarf und eventuelle OutOfMemoryException. Hallo, schöner Artikel ???? Ich würde fast den gleichen Kommentar abgeben. Versuchen Sie für dasselbe Szenario, die App eine Weile laufen zu lassen, z. B. einige Minuten. Sie würden feststellen, dass Ihr Objekt null wird. Ich bin froh, dass es dir gefallen hat, Hasan.

Ja, die Müllabfuhr zu erzwingen, ist fast immer eine sehr schlechte Idee. Ich kann eine Endlosschleife schreiben, die einer Liste Ganzzahlen hinzufügt, und obwohl mir dadurch der Speicher ausgeht, handelt es sich nicht um einen Speicherverlust. Ich mache nur etwas Dummes. Die meisten Ihrer Beispiele waren dieselben, wie der endlose Cache oder der Thread, der angewiesen wurde, für immer zu laufen. In all diesen Fällen macht der Programmierer etwas Dummes, und alle Dinge - auch dumme Dinge - erfordern Speicher.

Ihr Artikel enthält viele nützliche Informationen, aber wenn Sie alles als Leck bezeichnen, werden die Leute nur verwirrt darüber, was sie wirklich sind, wie heimtückisch sie sein können und somit die besten Möglichkeiten, sie zu finden, zu beheben und zu vermeiden. Ich schätze die Zeit, die Sie dafür aufgewendet haben, aber es ist wirklich ein Artikel über Speicherverwaltung, nicht über Speicherlecks. Anders zu tun ist kontraproduktiv. Danke für die Rückmeldung. Sie sind nicht der erste, der darauf hinweist, aber ich muss nicht zustimmen.

In verwaltetem Code kann ein Objekt, auf das verwiesen wird, das jedoch nicht verwendet wird, weiterhin als Speicherverlust betrachtet werden. Hallo, echte Speicherlecks können nur auftreten, wenn Sie den nativen Speicher verwalten, andernfalls haben Sie irgendwo einen Verweis auf ein Objekt. Sie können natürlich den iDisposable-Mechanismus im Artikel verwenden und erzwingen, aber warum dann C verwenden?

Der Hauptvorteil bei der Verwendung von Sprache mit GC Collector ist weg. Gibt es ein Tool, das GC manuell überprüfen kann, dh. Das wäre sehr hilfreich. Hallo Filip, auf jeden Fall können Sie einen Speicherprofiler wie dotMemory verwenden, um alle zugewiesenen Instanzen anzuzeigen. Es kann angehängt werden, um einen Speicherauszug zu verarbeiten oder zu öffnen. Visual Studio Enterprise kann Ihnen diese Informationen auch anzeigen. Es hat einen eingebauten Speicherprofiler.

Treten Sie der Mailingliste bei und erhalten Sie Updates zu neuen Artikeln. Hallo und willkommen in meinem Blog! Definieren von Speicherlecks in. NET In einer Umgebung, in der Müll gesammelt wird, ist der Begriff Speicherlecks etwas kontraintuitiv.

Wenn Sie Speicherverluste haben, sieht das Prozessspeicherdiagramm folgendermaßen aus: Statische Objekte und die lokalen Objekte, die derzeit aktiv sind, sind GC-Roots. Weitere Informationen finden Sie unter Grundlegendes zur Speicherbereinigung in.

(с) 2019 shopfreephoenix.com