C # Speicherausnahme - Warnstrategie

8

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

ist
  

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.

    
weismat 01.02.2012, 08:48
quelle

4 Antworten

3

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

    
AMissico 01.02.2012, 10:13
quelle
1

Sie können die Debugging-Tools für Windows installieren und adplus

verwenden
  

ADPlus.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.

    
Damien_The_Unbeliever 01.02.2012 09:11
quelle
1

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.

    
Spence 01.02.2012 10:00
quelle
0

Wie wäre es mit schwachen Referenzen zum Caching? clicky

    
user1096188 01.02.2012 08:51
quelle