2009-05-15 9 views
9
0:000> !dumpheap -stat 
total 1755874 objects 
Statistics: 
MT Count TotalSize Class Name 
7b9b0c64  1   12 System.Windows.Forms.Layout.TableLayout+ColumnSpanComparer 
.... 
7933303c 14006  4926456 System.Collections.Hashtable+bucket[] 
65246e00  804  4982192 System.Data.RBTree`1+Node[[System.Int32, mscorlib]][] 
054c55f0 44240  5662720 DevExpress.Utils.AppearanceObject 
793040bc 98823  7613156 System.Object[] 
793308ec 293700  55820016 System.String 
002435f0 50315 138631888  Free 
Total 1755874 objects 

Fragmented blocks larger than 0.5 MB: 
    Addr  Size  Followed by 
15a195c8 0.8MB   15ae3950 System.Collections.ArrayList 
15d81468 1.6MB   15f23708 System.String 
15f23984 1.0MB   16029ae4 System.String 
... about 7 more objects here 
1ee51764 0.5MB   1eedbaa4 System.WeakReference 
1f0df96c 2.4MB   1f34d4b0 System.String 
1f3e1ca8 3.7MB   1f79afc4 System.WeakReference 

Ich habe über Pinning und Fragmentierung gelesen. Es sieht fragmentiert zu mir angesichts der riesigen Menge an freiem Raum. Ich denke, ich muss es jetzt aufspüren.Ist mein Haufen fragmentiert

Gedanken? Feedback?

+1

Eigentlich viel freien Speicherplatz zu haben, ist eher ein Zeichen dafür, dass keine oder nur geringe Fragmentierung vorliegt. – VVS

+2

Die Ausgabe zeigt, dass die Anwendung 50315 Chucks von freiem Speicher hat und anscheinend die meisten von ihnen weniger als ein halbes Megabyte sind. Das sieht fragmentiert aus. –

Antwort

5

Also ... wir wissen, wir haben einen fragmentierten Haufen. Die nächste Frage ist: Was verursacht die Fragmentierung? Was verhindert, dass diese freien Objekte freigegeben werden? Die Empfehlungen, die ich gelesen habe ist es, die Objekte direkt nach dem freien Raum zu untersuchen:

1) dumpheap -stat 2) Sichern Sie die Methodentabelle des Frei Objekt: dumpheap -mt 000db8e8 3) Wählen Sie Gratis-Objekt ! das nächste Objekt Dump 5) dumpobj 0x2003b0b0 4) Plattengröße ist das Objekt, nachdem es: aus der Liste näher zu untersuchen! dumpobj 0x2003b0b0 + 1000 6), um ein Objekt, die eine Referenz gcroot 0x2003b0b0 + 1000 7) Dump die gchandle des gefundenen Objekts.

Ich bekomme normalerweise dieses Kaninchenloch, und mein begrenztes Wissen der .NET API versagt hier. Ist das der richtige Weg, das Problem zu beheben?

Jeff

+1

Ich habe mir angesehen, welcher Heap Fragmentierung ist. Ich benutze zunächst! Eeheap-gc, um eine Basis für die Segmente zu finden, aber SOSEX (http://www.stevestechspot.com/SOSEXV2NowAvailable.aspx) hat einige Befehle nur dafür. Es sieht so aus wie im Großen Objekt-Heap (was erwartet wird, da es niemals kompaktiert wird) und zu einem gewissen Grad im Gen2-Heap. Gen0 ist mir egal und Gen1 hat keine Fragmentierung. Ich denke, was Ihr Sprichwort ist, versuchen Sie herauszufinden, die Objekte, die nach der Fragmentierung zugeordnet sind, dann arbeiten von dort zurück, um zu sehen, was die Fragmentierung verursacht, d. H.! Dumpobj 0x2003b0b0 + 1000 – Keith