Mein Programm fördert den Speicher für Gen2 mit einer sehr hohen Rate (etwa 1 MB / s) und verursacht einen Leistungseinbruch, wenn die Gen2-Sammlung auftritt. Jeder Versuch, zu verstehen, welche Objekte befördert wurden, scheiterte - hauptsächlich aufgrund der Tatsache, dass, als ich 2 Dumps in windbg öffnete, die Erinnerung, aus der die Zunahme der Gen2-Größe bestand, als "Free" markiert wurde. Es führte mich zu dem Verdacht, dass gepinnte Objekte das Problem verursachen, aber die Perfmon Statistik zeigt, dass die Anzahl gepinnter Objekte sehr gering ist (etwa 2-4).
Was ich jetzt ausprobieren möchte, ist, irgendwie zu identifizieren, welche Objekte zur Laufzeit in Gen2 befördert werden. Gibt es eine Methode dafür?
Sie könnten WinDbg verwenden, um solche Probleme zu debuggen. Legen Sie einen Haltepunkt für die Garbage Collection-Routine fest, untersuchen Sie den verwalteten Heapspeicher, lassen Sie die Garbage Collection passieren und untersuchen Sie den verwalteten Heap erneut, um zu sehen, welche Objekte sich jetzt in Gen2 befinden.
Hier sind einige Links, mit denen Sie beginnen können:
Verfolgen von Lecks im verwalteten Speicher
Wie iteriert man auf der Objekte, die im verwalteten .NET-Heap vorhanden sind?
Untersuchen von .NET Memory Management und Müllsammlung
Entschuldigung, das ist keine direkte, detaillierte Antwort auf Ihre Frage, aber es sollte Ihnen einen Ausgangspunkt geben.
Es gibt ein paar 3 Parteien Speicher Profiler für .NET , versuchen Sie es, die meisten von ihnen ermöglichen Ihnen eine kostenlose Testphase. Ich erwarte, dass einer der führenden Speicher-Profiler Sie sehen lassen wird, was schnell vor sich geht.
Sie könnten versuchen, gen (0) und gen (1) Sammlungen zu erzwingen und einen Schnappschuss unmittelbar nach der Ausführung von
zu machen %Vor%Welche Art von GC-Geschmack verwenden Sie auch?
Tags und Links .net c# garbage-collection debugging windbg