Tengo problemas con una pérdida lenta de memoria en mi aplicación de modo mixto C++/CLR .NET.Fuga de memoria en modo mixto Aplicación C++/CLR
(Es C++ bibliotecas estáticas nativos vinculados en una VS2008 C++/CLR Windows Forms aplicación con la configuración del compilador "/ CLR")
comportamiento típico: aplicación comienza a utilizar 30 MB de memoria (privado). Luego, la memoria pierde velocidad, digamos un MB por hora cuando se ejecuta bajo carga pesada simulada. Esto simula la aplicación en vivo por días o semanas.
He intentado utilizar varias herramientas para rastrear fugas de memoria, incluidas las herramientas de depuración CRT que vienen con las librerías Visual Studio CRT. También utilicé una herramienta comercial de detección de fugas ("Validador de memoria").
Ambas informan pérdidas de memoria insignificantes al apagar (unas pocas entradas menores que ascienden a unos pocos KB que no me preocupan). Además, puedo ver al ejecutar que la memoria rastreada no parece ser tan alta (así que no creo que sea solo la memoria la que se retenga y solo se libere al salir de la aplicación). Obtengo alrededor de 5 MB de memoria listada (de un total> 30MB).
La herramienta (Validador de memoria) está configurada para rastrear todo el uso de memoria (incluyendo malloc, nueva asignación de memoria virtual y muchos otros tipos de asignación de memoria). Básicamente, cada ajuste para el que se ha seleccionado la memoria para rastrear.
La imagen .NET informa que está utilizando alrededor de 1,5 MB de memoria (de perfmon).
Aquí hay una última información: tenemos una versión de la aplicación que se ejecuta como una aplicación de consola nativa (puramente nativa, no CLR en absoluto). Esto es 95% lo mismo que el modo mixto, excepto sin las cosas de UI. Esto no parece perder memoria en absoluto, y alcanza un máximo de alrededor de 5 MB de bytes privados.
Básicamente, lo que estoy tratando de transmitir aquí es que no creo que el código nativo tenga pérdidas de memoria.
Otra pieza del rompecabezas: He encontrado esto lo que se refiere a las pérdidas de memoria en aplicaciones en modo mixto cuando la orientación marco 2.0 (que soy): http://support.microsoft.com/kb/961870
Desafortunadamente los detalles son exasperantemente escasa así que no estoy seguro de si es relevante Intenté orientarme a 3.5 framework en lugar de a 2.0, pero aún tenía el mismo problema (tal vez no lo hice bien).
¿Alguien tiene alguna sugerencia?
Un par de cosas que me podrían ayudar:
- ¿Hay algún otro tipo de asignaciones de memoria que no estoy de rastreo?
- ¿Cómo es que las cifras no suman? Obtengo 5 MB de uso de memoria CRT, 1.5 MB de memoria .NET, ¿cómo es que toda la aplicación usa 30 MB de bytes privados? ¿Está todo eso atado en el framework .NET? ¿Por qué no los veo en la herramienta de fugas? ¿El marco .NET no aparecerá como algún tipo de memoria asignada?
- ¿Alguna otra herramienta de detección de fugas que funcione bien con aplicaciones de modo mixto?
Gracias por cualquier ayuda
John
.NET 2.0 y .NET 3.5 ambos usan el mismo CLR 2.0, como se puede ver fácilmente en los números de versión ;-) –