2009-05-15 12 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 

Ho letto sul blocco e sulla frammentazione. Mi sembra frammentato data l'enorme quantità di spazio libero. Credo che ora devo rintracciarlo.Il mio heap è frammentato

Pensieri? risposta?

+1

In realtà, avendo un sacco di spazio libero è più simile a un segno di avere poca o nessuna frammentazione. – VVS

+2

L'output mostra che l'applicazione ha 50315 chuck di memoria libera e apparentemente la maggior parte di essi ha meno di mezzo megabyte. Mi sembra frammentato. –

risposta

5

Quindi ... sappiamo di avere un mucchio frammentato. La prossima domanda è: cosa sta causando la frammentazione? Cosa impedisce la pubblicazione di questi oggetti gratuiti? Le raccomandazioni che ho letto è quello di esaminare gli oggetti subito dopo lo spazio libero:

1) dumpheap -stat 2) Dump tavolo metodo dell'oggetto libero:! Dumpheap -MT 000db8e8 3) Selezionare un oggetto libero dalla lista per esaminare più da vicino: dumpobj 0x2003b0b0 4) Record dimensioni dell'oggetto 5) Dump l'oggetto successivo dopo che è:!! dumpobj 0x2003b0b0 + 1000 6) Trovare l'oggetto che contiene un riferimento gcroot 0x2003b0b0 + 1000 7) Scarica il gchandle dell'oggetto trovato.

Io di solito ottenere su questa tana del coniglio, e la mia limitata conoscenza delle API .NET fallisce qui. È questo il modo corretto di eseguire il debug del problema?

Jeff

+1

Ho visto quale heap è la frammentazione. Inizialmente ho usato! Eeheap -gc per ottenere una base per i segmenti da cercare, tuttavia SOSEX (http://www.stevestechspot.com/SOSEXV2NowAvailable.aspx) ha alcuni comandi solo per questo. La sua somiglianza è nell'heap di oggetto Large (che è previsto come mai compattato) e in una certa misura nell'heap di gen2. gen0 Non mi interessa e gen1 non ha alcuna frammentazione. Penso che quello che stai dicendo è cercare di capire gli oggetti che sono assegnati dopo la frammentazione, quindi tornare indietro da lì per vedere che cosa sta causando la frammentazione, ad esempio! Dumpobj 0x2003b0b0 + 1000 – Keith