2008-10-22 48 views
27

Podría seguir 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.Fugas de memoria en C# WPF

Estoy usando .NET Memory Profiler y he encontrado que uno de mis grandes 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 severos.

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

+0

pruebe también el Ants Memory Profiler, ya que mostrará objetos de brujas puntos a un objeto dado –

Respuesta

39

interrumpir el depurador y escriba esto en la ventana Inmediato:

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

El camino 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.

A continuación, escriba lo siguiente:

System.GC.Collect() 

que asegurará todo lo que no se recoge alcanzable. Luego escriba esto:

!DumpHeap -type <some-type-name> 

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

!gcroot <some-address> 
+0

Tuve que usar System.GC.Collect() para que funcione la recolección de basura. – nash

+0

Creo que eso puede depender de dónde se haya detenido el depurador cuando se interrumpe. Repararé mi respuesta para que funcione independientemente. –

8

.NET memoria Profiler es una herramienta excelente, y que yo uso con frecuencia para diagnosticar pérdidas de memoria en aplicaciones WPF.

Como estoy seguro de que sabe, una buena forma de utilizarlo 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 los dos instantáneas, puede ver cuántos objetos de un cierto tipo están siendo asignados pero no liberados: 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 que mantienen vivos los objetos de ese tipo. Hay muchas formas 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é un blog entry sobre un particular memory leak que puede ser causado por ciertas fijaciones; para esos tipos específicos de fuga, el código allí es útil para encontrar el enlace que tiene la culpa.