Generalmente, si tiene una fuga en una aplicación administrada, significa que algo no se está recopilando. Las fuentes comunes incluyen
Manejadores de eventos: si el suscriptor no se elimina, el editor se aferrará a él.
Estática
finalizadores: un finalizador bloqueado impedirá que el subproceso finalizador se ejecute cualquier otro finalizadores y así evitar estos casos de ser recogido.
De forma similar, un hilo estancado se mantendrá en las raíces que contenga. Por supuesto, si tienes hilos bloqueados que probablemente afectarán a la aplicación en varios niveles.
Para resolver este problema, debe inspeccionar el montón administrado. WinDbg + SOS (o PSSCOR) te permitirá hacer esto. El comando !dumpheap -stat
enumera todo el montón administrado.
Debe tener una idea del número de instancias de cada tipo que se esperan en el montón. Una vez que encuentre algo que parece extraño, puede usar el comando !dumpheap -mt <METHOD TABLE>
para listar todas las instancias de un tipo dado.
El siguiente paso es analizar la raíz de estas instancias. Elija uno al azar y haga un !gcroot
en eso. Eso mostrará cómo está enraizada esa instancia particular. Busque controladores de eventos y objetos anclados (generalmente representan referencias estáticas). Si ve la cola del finalizador allí, necesita examinar qué está haciendo el hilo del finalizador. Use los comandos !threads
y !clrstack
para eso.
Si todo se ve bien para esa instancia, pasará a otra instancia. Si eso no produce nada, es posible que deba volver a mirar el montón nuevamente y repetir desde allí.
Otras fuentes de fugas incluyen: Conjuntos que no están descargados y fragmentación del gran montón de objetos. SOS/PSSCOR puede ayudarlo a localizar estos también, pero omitiré los detalles por el momento.
Si quiere saber más, recomiendo Tess' blog. También hice un par de videos sobre cómo usar WinDbg + SOS (here y here).
Si tiene la opción de depurar el proceso mientras se ejecuta, le recomiendo usar PSSCOR en lugar de SOS. PSSCOR es esencialmente una rama privada de las fuentes SOS que se ha mejorado con comandos adicionales y muchos de los comandos SOS existentes también se han mejorado. P.ej. La versión PSSCOR del comando !dumpheap
tiene una columna delta muy útil, lo que hace que la solución de problemas de pérdida de memoria sea mucho más fácil.
Para utilizarlo, necesita iniciar su proceso, conectar WinDbg y cargar PSSCOR y hacer un !dumpheap -stat
. Luego, permite que el proceso vuelva a ejecutarse para que se realicen asignaciones. Rompe la ejecución y repite el comando. Ahora PSSCOR le mostrará el número de instancias que se agregaron/eliminaron desde la inspección anterior.
Visual Studio 2013 Ultimate Edition solo aunque ... – Samuel
@Samuel: ¿En serio? Qué triste y decepcionante ... –
Este es el artículo msdn al que se hace referencia: http://blogs.msdn.com/b/visualstudioalm/archive/2013/06/20/using-visual-studio-2013-to-diagnose-net -memory-issues-in-production.aspx. Establece que un requisito previo para la opción es Ultimate. Decepcionante, como creo que estaba disponible en el RC1 y se ha introducido en Ultimate, que es una característica bastante costosa ... – Samuel