Innerhalb einer komplexen Multithread-Anwendung treffe ich gelegentlich einmal pro Woche eine Out-of-Memory-Ausnahme. Die Anwendung sendet / liest große Datenmengen über mehrere Sockets, wo die gelesenen Daten zwischengespeichert werden, um einen Überlauf der Netzwerkkartenpuffer zu vermeiden.
Was ist die beste Strategie, um die Speicherausnahmen zu analysieren? Während der normalen Laufzeit wird die App im Process explorer mit einer Größe von "Total bytes in Heaps" von bis zu 1,5 Gigabyte angezeigt.
Könnte es eine Strategie sein, einen Thread zu haben, der entweder polling
GC.GetTotalMemory ()
oder
PrivateMemorySize64 ()
einmal pro Sekunde, um zu wissen, wann man beginnt, Dinge zu analysieren? Ich habe mich noch nicht mit kommerziellen Profilern beschäftigt und bin ein wenig besorgt über die Auswirkungen auf die Performance, die bei der eigentlichen Problemanalyse auch zu falschen Ergebnissen führen könnten.
Ihr Speicher wird wahrscheinlich durch zahlreiche String-Operationen oder andere Operationen fragmentiert, die kleine Speicherblöcke wie Boxing / Unboxing erstellen und freigeben.
Sie erhalten diese Ausnahme, wenn die CLR keinen genügend großen freien Speicherblock reservieren kann.
Ich benutze den "CLR Profiler" und überprüfe die Speicherzuweisungen. Wenn Sie zahlreiche weiße Flecken (freie Blöcke) und keine großen freien Blöcke sehen, dann müssen Sie anfangen zu sehen, wie Sie Objekte zuweisen.
Überprüfen Sie beispielsweise vor dem Zuweisen einer Zeichenfolge zu einer anderen, ob die Zeichenfolgen zuerst unterschiedlich sind. Mit StringBuilder lassen sich alle Fälle eliminieren, Boxing und andere Speicheroptimierungen beseitigen.
Ich benutze diese Technik und beseitige die Ausnahmen vollständig, außer für ein bekanntes Problem mit binärer Deserialisierung.
Entdecken Sie die verlorene Kunst der Speicheroptimierung in Ihrem verwalteten Code unter Ссылка
Untersuchung von Speicherproblemen unter Ссылка
Leistungsoptimierung in Visual Basic .NET unter Ссылка (v = vs.71) .aspx
Sie können die Debugging-Tools für Windows installieren und adplus
verwendenADPlus.vbs (ADPlus) ist ein Tool von Microsoft Product Support Services (PSS), das Probleme oder Anwendungen beheben kann, die nicht mehr reagieren (Hänge) oder fehlschlagen (abstürzt).
Grundsätzlich können Sie festlegen, dass die Anwendung beobachtet wird, und wenn sie abstürzt, wird ein Dump erfasst, den Sie dann mit WinDBG / SOS analysieren können.
Sie können einen MemoryFailPoint verwenden, um einige Garantien zu geben eine gegebene Operation
Ich empfehle jedoch, den Prozess, in dem Ihre App ausgeführt wird, zu isolieren und auf 64 Bit zu verschieben, wenn dies eine Option ist. Möglicherweise müssen Sie die Leistung reduzieren, um die Speicherauslastung zu garantieren.
Tags und Links c# out-of-memory memory-profiling