recoleccion programacion memoria liberar leaks basura avoid c# memory-leaks garbage-collection profiling

programacion - Fugas de memoria en C#WPF



recoleccion de basura en programacion (2)

Podría utilizar algunos consejos para rastrear la causa de las pérdidas de memoria en C #. Entiendo lo que es una pérdida de memoria y entiendo por qué ocurren en C #, pero me pregunto qué herramientas / estrategias usaste en el pasado para resolverlas.

Estoy usando .NET Memory Profiler y he descubierto que uno de mis enormes objetos principales se queda en la memoria después de cerrar la ventana que administra, pero no estoy seguro de qué hacer con todos los enlaces a él.

Si no estoy siendo lo suficientemente claro, solo publique una respuesta con una pregunta y voy a editar mi pregunta en respuesta. ¡Gracias!


.NET Memory Profiler es una herramienta excelente, y una herramienta que uso frecuentemente para diagnosticar fugas de memoria en aplicaciones WPF.

Como estoy seguro de que sabe, una buena forma de usarlo es tomar una instantánea antes de usar una función en particular, luego tomar una segunda instantánea después de usarla, cerrar la ventana, etc. Al comparar las dos instantáneas, puede ver cuántos objetos de un cierto tipo se asignan pero no se liberan: esto es una fuga.

Después de hacer doble clic en un tipo, el generador de perfiles le mostrará las rutas de raíz más cortas para mantener vivos los objetos de ese tipo. Hay muchas maneras diferentes en que los objetos .NET pueden tener fugas en WPF, por lo que publicar la ruta raíz que está viendo debería ayudar a identificar la causa última. Sin embargo, en general, trate de comprender por qué esos objetos se mantienen sobre su objeto, y vea si hay alguna forma de separar los manejadores de eventos, enlaces, etc. cuando la ventana está cerrada.

Recientemente publiqué una entrada de blog sobre una pérdida de memoria en particular que puede ser causada por ciertas vinculaciones; para esos tipos específicos de fuga, el código allí es útil para encontrar el enlace que tiene la culpa.


Entre en el depurador y luego escriba esto en la ventana Inmediato:

.load C:/Windows/Microsoft.NET/Framework/v2.0.50727/sos.dll

La ruta de acceso a sos.dll varía. La forma de descubrir la ruta correcta es buscar mscorwks.dll en el panel Módulos. Donde sea que se cargue eso es la ruta correcta para sos.dll.

Luego escribe esto:

System.GC.Collect()

Eso asegurará que se recopile todo lo que no se puede alcanzar. Luego escribe esto:

!DumpHeap -type <some-type-name>

Esto le mostrará una tabla de todas las instancias existentes, con direcciones. Puede averiguar qué es lo que mantiene viva una instancia como esta:

!gcroot <some-address>