2010-09-20 17 views
8

La aplicación que estoy escribiendo sufre dramáticamente por una pérdida de memoria. Casi todo el modelo de objetos permanece en la memoria cuando un usuario cierra un proyecto cargado. La forma en que sé esto es porque cerrar un proyecto en mi aplicación apenas afecta el uso de la memoria en el administrador de tareas y luego abrir un nuevo proyecto casi lo duplica cada vez. Descargué dotTrace Memory 3.5 de jetBrain pero hay pocas (ninguna) instrucciones de uso. Descubrí cómo usarlo y muestra que el modelo de objetos completo todavía está en la memoria cuando tomo una instantánea después de que se ha cerrado un proyecto. Navegando a través de mi proyecto Cerrar el código No veo ninguna razón para esto. ¿Alguien sabe de algo en particular que normalmente causa pérdidas de memoria en C# o de cualquier herramienta o técnica para rastrear el problema? Está muy bien tener una aplicación que muestre que todo mi modelo de objetos todavía está cargado en la memoria, pero no me muestra qué objeto o variable lo está almacenando. Gracias por adelantado.C# Fuga de memoria, tecnología y herramientas de seguimiento

+0

debe usar el delegador, lo ayudará con las pérdidas de memoria –

Respuesta

4

En primer lugar, investigar si la fuga podría ser debido al registro de controladores de eventos, ya que es una de las maneras más fáciles de erradicar accidentalmente sus objetos. Por ejemplo, si tiene una clase 'Bob' que agrega uno de sus métodos 'OnSomeEvent' como delegado a un evento que se genera por un componente de larga vida de su sistema (por ejemplo, 'UserSettingsManager'), entonces los objetos de la clase 'Bob' 'no se recopilará, ya que se mantienen vivos en virtud de ser un controlador de eventos (es decir, las devoluciones de llamadas de eventos no son referencias débiles).

Como alternativa a las herramientas comerciales, hay una extensión del depurador de Windows llamada SoS (Son of Strike) que puede usar para depurar aplicaciones administradas. Sin embargo, no es descorazonado, ya que es una herramienta de línea de comandos de bajo nivel que requiere mucho aprendizaje inicial. Sin embargo, es muy poderoso y no tiene tanta dificultad con procesos más grandes (en términos de consumo de pila) como lo hacen las herramientas comerciales.

En cuanto a los perfiladores comerciales, he tenido buenas experiencias con ANTS Memory Profiler de Redgate (pero he tenido colegas que lo odian) por lo que puede valer la pena probarlo.

3

Probablemente la causa más común de fugas de memoria administradas es la de los manejadores de eventos no suscritos.

Existen varias herramientas útiles para rastrear errores como este. Personalmente me gusta ANTS Memory Profiler y WinDbg/SOS. Desea averiguar qué está enraizando los gráficos de objeto. Con WinDbg/SOS hay un comando !gcroot, que le dirá las raíces de cualquier objeto dado.

Consulte Tess' blog para obtener instrucciones sobre cómo solucionar problemas de memoria con WinDbg/SOS.