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
Respuesta
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.
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.
- 1. Herramientas de detección de fuga de memoria
- 2. Fuga de memoria en C++
- 3. C# WPF BitmapSource ¿Fuga de memoria?
- 4. seguimiento de las asignaciones de memoria C++
- 5. Fuga de memoria IE9
- 6. ThreadLocal <> y fuga de memoria
- 7. tecnología de memoria caché distribuida
- 8. Fuga de memoria de suplantación
- 9. Seguimiento de hilos de memoria y consumo de CPU
- 10. Fuga de memoria con ContextMenuStrip
- 11. ¿Una fuga de memoria de la aplicación causa una fuga de memoria en el sistema operativo?
- 12. Fuga de memoria en Swing
- 13. Fuga de memoria no administrada
- 14. Fuga de memoria para CComBSTR
- 15. Fuga de memoria en modo mixto Aplicación C++/CLR
- 16. prueba de unidad de fuga de memoria C++
- 17. Fuga de memoria de carga de imagen con C#
- 18. Fuga de memoria grande con accesibilidad
- 19. gtkmm/C++ primer hello world ejemplo de fuga de memoria
- 20. ¿Cómo puedo habilitar el seguimiento de fuga de memoria con FastMM en DUnit?
- 21. Detección de fuga de memoria en Windows para GNU C/C++
- 22. Fuga de memoria al utilizar OpenMP
- 23. jQuery patrones de fuga de memoria y causas
- 24. rabbitmq + fuga de memoria de apio?
- 25. ¿Cómo rastrear una fuga de memoria mod_perl?
- 26. La mejor definición de fuga de memoria
- 27. Uso de la memoria de seguimiento de Xcode and Instruments
- 28. .NET RegEx "fuga de memoria" investigación
- 29. ¿Fuga de memoria con ViewScoped bean?
- 30. Fuga de memoria al utilizar SharedResourceDictionary
debe usar el delegador, lo ayudará con las pérdidas de memoria –