.Net Garbage Collector - Sehen Sie, was während Runtime zu Gen2 hochgestuft wird

8

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?

    
galbarm 07.03.2011, 08:45
quelle

4 Antworten

5

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?

Blog von Tess Ferrandez

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.

    
sloth 07.03.2011, 08:59
quelle
2

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.

    
Ian Ringrose 07.03.2011 15:00
quelle
1

Sie könnten viel LOH zuweisen. Hier ist eine Möglichkeit, einen Durchbruch bei der LOH-Zuteilung zu erreichen. bp mscorwks!wks::gc_heap::allocate_large_object “!CLRStack” in Winbdg.

HTH

    
Naveen 07.03.2011 14:21
quelle
0

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?

    
Florian Doyon 07.03.2011 14:28
quelle