2009-05-29 12 views
13

Hay varias maneras en que los desarrolladores pueden ser atrapados por filtraciones de recursos involuntarias en .NET. Pensé que sería útil reunirlos en un solo lugar..NET Resource Leak Gotchas

Por favor, añada la suya con una respuesta por tema, por lo que la mejor get votó a :)

+1

Post relacionados: http://stackoverflow.com/questions/20386/memory-leaks-in-net –

+2

¿No debería ser esto Wiki de la Comunidad!?!? –

+2

No en CW: que sea recompensado por plantear la pregunta. Buena pregunta, por cierto. – ine

Respuesta

6

Dejando las conexiones de base de datos abierta.

4

Fallo de implementación Elimine y por lo tanto no elimine objetos secundarios.

+1

O, implementándolo, y no poniendo código en un bloque Using. –

+1

O implementando Dispose pero no agregando un Finalizer que llama a Dispose. –

0

Manijas del token de suplantación que quedan abiertas.

7

P/Invocando al código no administrado, y no limpiándolos, o no implementando IDisposable para limpiarlos.

8

No se eliminaron los controladores de eventos.

El registro para un evento debe ser emparejado con un-registro:

this.myObject.MyEvent += new EventHandler(myObject_MyEvent); 
    this.myObject.MyEvent -= new EventHandler(myObject_MyEvent); 

No es un ejemplo de un sistema en el que esto ocurrió el CodeProject.

1

No se pudo llamar al método 'Cerrar' en el objeto System.Windows.Window.

La única forma de garantizar que todos los recursos gestionados para un objeto System.Windows.Window sean basura es llamar al método 'Cerrar()' en el objeto Ventana. Llamar a Dispose o establecer la referencia del objeto a null no destruirá el objeto.

+0

¿Puede proporcionar una cita para esto? –

+0

@John: Esto fue encontrado por un colega mío durante una búsqueda de fuga de recursos, por lo que no tengo una referencia publicada. –

1

Si cuenta la memoria administrada como un "recurso", no desenganchar controladores de eventos es una fuente común de pérdidas de memoria (y varios otros errores más graves).

+0

La memoria administrada no es un recurso, pero sí suscripciones a eventos. – supercat

1

Listas estáticas, diccionarios y recursos basados ​​en colecciones que se completan fuera del código de inicio.

Esto puede suceder si tiene un diccionario que utiliza como un caché global en lugar de un caché basado en LRU adecuado.

Cualquier cosa estática requiere mucha precaución adicional!

2

Casi todo al utilizar las API de Office. Como son todos objetos COM, deben eliminarse. También debe mantener una referencia de clase para ellos si desea usar controladores de eventos, de lo contrario, perderán su referencia. En muchos casos, incluso tiene que llamar manualmente al GC para limpiar los objetos

4

Los objetos del cliente WCF no funcionan como otros objetos IDisposables. El cliente de un servicio WCF debe interrumpirse si la operación está en estado de falla o mantendrá la conexión abierta. Esto generalmente se aprende de la manera difícil.

+0

WCF me quemó con un problema similar recientemente. Lo publicaré pero implicaba llamar a Dispose en la fábrica, lo que implementa IDispose. –

7

No se usa Using.

2

El uso de WeakReference puede ocasionar la sutil fuga en la que se limpia el objeto mantenido por WeakReference porque no tiene referencias sólidas, pero la WeakReference en sí misma no se debe a que guarde una referencia fuerte.

Puede encontrarlo si tiene algo así como una Lista o un Diccionario de WeakReferences que nunca borra. Terminarás filtrando objetos WeakReference incluso después de que el objetivo haya sido recolectado.

0

No se eliminaron objetos relacionados con el dibujo (Gráficos, Fuentes, SolidBrush, Pen, etc.) en .NET Compact Framework. Esto puede causar algunas pérdidas de memoria graves cuando no lo desee (dispositivo móvil = memoria limitada).

1

Fácil pérdida de memoria: crea un campo estático en una clase de tipo Lista. Agregar elementos a la lista. Nunca recibirán basura recolectada, así que a menos que recuerde eliminar manualmente sus artículos cuando haya terminado con ellos, la memoria está permanentemente atada.

0

desconfigurándolos Spring.NET para crear varias instancias de algo que debería ser un producto único.