Pérdidas de memoria y recursos en aplicaciones .NET

Lo siguiente es un (muy) breve resumen de un artículo de la MSDN:

Artículo original

En primer lugar, es vital entender que los lenguajes con recolector de basura como .NET no son inmunes a las pérdidas de memoria. Una de las razones de ello es que el recolector sólo libera memoria que ya no es referenciada: si el contador de referencias de un objeto no llega a cero porque dejamos una referencia colgada, el recolector no nos salvará.

Por otro lado, cuando hablamos de aplicaciones .NET que corren en Windows, dichas aplicaciones suelen consumir diversos recursos del SO, que idealmente deben ser liberados apenas dejan de ser usados.

El autor del artículo menciona una técnica "ninja" para eliminar pérdidas:

The ninja way :)

Aunque él prefiere usar herramientas de más alto nivel, como las mencionadas aquí:

Herramientas Copantes

Causas usuales de memory leaks en .NET:
  1. Referencias estáticas (atributos estáticos y Singletons). Además, un objeto estático no liberado que contiene otros objetos hace que todos ellos no sean liberados...
  2. Eventos (o eventos estáticos) que no cancelan su subscripción
  3. No invocar al método Dispose
  4. Método Dispose (de una clase propia) incompleto
  5. Bugs en las bibliotecas que usa el proyecto o en .NET (sólo considerar esto una vez que nos hayamos cerciorado de que nuestro código está limpio)
Luego de mostrar varios ejemplos de leaks y su detección usando la herramienta dotTrace, el autor menciona algunas prácticas para prevenir leaks:
  1. Todo objeto que crea un objeto es responsable por destruirlo, a menos que hablemos del patrón Factory. En ese caso, se puede responsabilizar al cliente de la factory, o agregar a ésta la funcionalidad de destruir los objetos que creó (pasándole un id, por ejemplo)
  2. Los eventos son la principal causa de leaks en .NET. Siempre dar de baja las subscripciones cuando dejen de ser necesarias
  3. Siempre invocar a Dispose, y mantener actualizados los Dispose de nuestras clases cuando agregamos recursos a ellas

Finalmente, el autor recomienda una serie de herramientas muy interesantes. Aconsejo verlas en el artículo original.

Comments

Popular posts from this blog

VB.NET: Raise base class events from a derived class

Apache Kafka - I - High level architecture and concepts

Upgrading Lodash from 3.x to 4.x