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 originalEn 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í:
Causas usuales de memory leaks en .NET:- 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...
- Eventos (o eventos estáticos) que no cancelan su subscripción
- No invocar al método Dispose
- Método Dispose (de una clase propia) incompleto
- 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)
- 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)
- Los eventos son la principal causa de leaks en .NET. Siempre dar de baja las subscripciones cuando dejen de ser necesarias
- 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
Post a Comment