Framentación de memoria de objetos grandes en .NET

Esta semana he estado lidiando con un problema de memoria en una aplicación de escritorio .NET. Dicha aplicación se ejecuta en varios clientes sin problemas, tanto de 32 bits como 64bits. Nos vemos obligados a compilar en 32 bits por el hecho de que no es posible acceder a una base de datos de Access desde .NET 64 bits. La misma aplicación de escritorio se ejecuta sin problemas en docenas de ordenadores, pero en un caso, y tras varias horas de uso, se producían errores graves con el GUI, que se volvía inmanejable y lanzaba excepciones extrañas.

Tras buscar fugas de memoria y reducir el consumo de la misma reduciendo la cantidad los datos cargados en la medida de lo posible (y de paso optimizar los tiempos, así que no hay mal que por bien no venga), el problema parecía restingirse cada vez más a una cuestión de fragmentación de memoria. Una pormenorizada explicación del concepto puede encontrarse en este antiguo post.

Aunque los contadores no parecían indicarlo una herramienta llamada Address Space Monitor  nos ayudó a monitorizar el comportamiento, puesto que no hay un contador específico en Windows para ver el tamaño máximo de memoria contigua disponible y tampoco existe ninguna clase en el framework que nos los ofrezca dicha información.

Tras localizar el problema, las posibles soluciones son:

  • Si la funcionalidad y arquitectura del sistema lo permite, reducir la liberación de memoria, reutilizando o compartiendo los objetos cuando sea posible.
  • Compilar en 64 bits, lo cual permite al sistema manejar cantidades mucho mayores de memoria. En nuestro caso será la solución, aunque para ello deberemos implementar un nuevo proceso de intercambio de datos que se heredó de un sistema anterior y que se mantuvo aún cuando ya no hacía falta.
  • La nueva versión del framework 4.5 permite compactar la pila de objetos grandes.

Lección aprendida: no dejes que la herencia lastre tu sistema, y no subestimes el tiempo que un usuario puede tener abierta una aplicación.

Anuncios
Tagged with: ,
Publicado en Programacion

Deixa a túa opinión

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: