2011-03-07 17 views
8

Mi programa está promocionando la memoria a Gen2 a una velocidad muy alta (aproximadamente 1MB/Sec) y causa un impacto en el rendimiento cuando se produce la recopilación Gen2. Todos los intentos que hice para comprender qué objetos se promovieron fallaron, principalmente debido al hecho de que cuando abrí 2 vuelcos en windbg, la memoria desde la cual se creó el aumento del tamaño Gen2, se marcó como "Libre". Me llevó a sospechar que los objetos fijados están causando el problema, pero las estadísticas perfmon muestran que el número de objetos fijados es muy bajo (alrededor de 2-4)..Net Recolector de basura: consulte qué se promociona a Gen2 durante el Runtime

Lo que estoy pensando en intentar ahora es identificar de alguna manera qué objetos se promueven a Gen2 en tiempo de ejecución. ¿Hay un método para hacer esto?

+1

Sospecho que no dispone de sus objetos desechables. La mayoría de los objetos no expuestos ejecutarán su finalizador y se desharán de allí. Los finalizadores bloquean la recopilación de GC [sección "Cómo afecta la finalización a la recopilación"] (http://msdn.microsoft.com/en-us/library/ms973837.aspx#dotnetgcbasics_topic5). –

+1

¿Está asignando objetos grandes? Los objetos AFAIK asignados en el montón de objetos grandes van al generador 2 de inmediato. – CodesInChaos

Respuesta

5

Puede usar WinDbg para solucionar estos problemas. Establezca un punto de interrupción en la rutina de recopilación de elementos no utilizados, examine el montón administrado, permita que se produzca la recolección de elementos no utilizados y luego vuelva a examinar el montón administrado para ver qué objetos están en Gen2 ahora.

Éstos son algunos enlaces para empezar:

Tracking down managed memory leaks

How to iterate on the objects present in the .NET managed heap?

Tess Ferrandez' blog

Investigating .NET Memory Management and Garbage Collection

sentimos que no es una respuesta directa, detallada a su pregunta, pero debería darle un punto de partida.

+0

No es necesario utilizar WinDBG para cargar Strike, ya que VS2003 se puede cargar a través de la ventana "Inmediato" cuando se detiene en un punto de interrupción. Documentos para 2010: http://msdn.microsoft.com/en-us/library/yy6d2sxs.aspx: instrucciones para otras versiones disponibles en Bing. – stephbu

1

Podría asignar mucho LOH. Aquí hay una manera de tener un punto de inflexión en la asignación de LOH. bp mscorwks!wks::gc_heap::allocate_large_object “!CLRStack” dentro de Winbdg.

HTH

0

Usted podría intentar forzar generación (0) y Gen (1) colecciones y tomar una instantánea inmediatamente después de que finalice la ejecución de

GC.Collect(1,GCCollectionMode.Forced); 
GC.WaitForPendingFinalizers(); 
CreateDump(); 

Además, ¿qué tipo de sabor GC son tu consumo?

2

Hay unas 3 party memory profilers for .NET, pruébalas, la mayoría de ellas te permiten un período de prueba gratuito. Espero que cualquiera de los principales perfiladores de memoria te permita ver lo que está sucediendo rápidamente.

Cuestiones relacionadas