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

He estado leyendo sobre fijación y fragmentación. Me parece fragmentado dada la enorme cantidad de espacio libre. Creo que ahora tengo que rastrearlo.Es mi montón fragmentado

¿Pensamientos? ¿realimentación?

+1

En realidad, tener mucho espacio libre es más como un signo de no tener o poca fragmentación. – VVS

+2

La salida muestra que la aplicación tiene 50315 mandriles de memoria libre y aparentemente la mayoría de ellos son menos de medio megabyte. Eso se ve fragmentado para mí. –

Respuesta

5

Entonces ... sabemos que tenemos un montón fragmentado. La siguiente pregunta es: ¿qué está causando la fragmentación? ¿Qué impide que estos objetos gratuitos sean lanzados? Las recomendaciones que he leído es examinar los objetos justo después del espacio libre:

1) dumpheap -stat 2) Volcado de la tabla de métodos del objeto libre: ¡dumpheap -mt 000db8e8 3) Seleccione un objeto gratuito de la lista para examinar más de cerca: dumpobj 0x2003b0b0 4) Registrar el tamaño del objeto 5) Volcar el siguiente objeto después de que:!! dumpobj 0x2003b0b0 + 1000 6) Busca el objeto que sostiene una referencia gcroot 0x2003b0b0 + 1000 7) Vuelca la mercancía del objeto encontrado.

Normalmente me sale este agujero de conejo, y mi conocimiento limitado de .NET API falla aquí. ¿Es esta la forma correcta de solucionar el problema?

Jeff

+1

He echado un vistazo a qué montón es la fragmentación. Inicialmente utilicé! Eeheap -gc para obtener una base para los segmentos para buscar, sin embargo, SOSEX (http://www.stevestechspot.com/SOSEXV2NowAvailable.aspx) tiene algunos comandos solo para esto. Parece que está en el montón de objetos grandes (que se espera que nunca esté compactado) y, en cierta medida, en el montón gen2. gen0 No me importa y gen1 no tiene fragmentación. Creo que lo que dices es que intentas descubrir los objetos que están asignados después de la fragmentación y luego volver a trabajar desde allí para ver qué está causando la fragmentación, es decir,! Dumpobj 0x2003b0b0 + 1000 – Keith

Cuestiones relacionadas