.NET administrará la recolección de basura para usted de manera muy eficiente. Mientras que en los tipos que implementan IDisposable
es aconsejable llamar al método Dispose
, probablemente este no sea su problema. Las pérdidas de memoria pueden ocurrir en .NET por muchas razones. Éstos son algunos:
- Caché demasiados datos por usuario en la sesión.
- Caché demasiados datos en un nivel de aplicación en la memoria caché de la aplicación o en una variable estática, como un diccionario.
- Almacena controles web (o controles de usuario) en la sesión o el nivel de aplicación.
- Enlaza instancias a eventos en tipos estáticos o a tipos que siguen siendo referenciados (porque están almacenados en un caché).
Espero que esto le dé algunas ideas sobre dónde buscar.
ACTUALIZACIÓN: Usted debe ver this video sobre la depuración ASP.NET.
ACTUALIZACIÓN 2: Acerca de su comentario en mi respuesta el siguiente. El CLR recogerá toda la memoria administrada, por lo tanto, todos los objetos que cree usando new
se recopilarán. En este sentido, no importa si un objeto implementa IDisposable
o no. Sin embargo, hay muchas veces que necesita usar recursos nativos (como manejadores de archivos, identificadores gráficos, conexiones de bases de datos, uso de memoria nativa -thus no administrada) directa o indirectamente. CLR no sabe cómo liberar estos recursos. Para esto .NET tiene la noción de finalizadores. Un finalizador es un método virtual que puede implementar un desarrollador de una clase. Cuando hace esto, el CLR llamará a este método después de que una instancia de ese tipo no se refiera y antes de que se recopile. Los finalizadores suelen contener lógica que libera estos recursos. En otras palabras, cuando un tipo necesita recursos nativos, generalmente tendrá un método de finalizador que permita que el tipo libere esos recursos.
¿Qué pasa con el CLR se refiere, la historia termina aquí. El CLR no tiene un manejo específico de los objetos que implementan la interfaz IDisposable
. Sin embargo, el recolector de basura .NET es de naturaleza no determinista. Esto significa que no sabe cuándo se ejecuta y si se ejecuta. Esto significa que puede tomar mucho tiempo antes de que sus recursos nativos se limpien (porque un finalizador solo se llamará después de un recopilatorio). Sin embargo, para muchos recursos, es necesario liberarlos tan pronto como haya terminado con ellos. Por ejemplo, tiende a quedarse sin conexiones de bases de datos rápidamente cuando no las cierra o cuando está trabajando con GDI + en .NET a través del espacio de nombres System.Drawing).
Por esta razón se introdujo la interfaz IDisposable
. Una vez más, el CLR y el recolector de basura no miran esta interfaz. Es un contrato entre el tipo y sus usuarios, lo que permite a los usuarios liberar directamente los recursos subyacentes de un objeto. En un diseño normal, tanto el finalizador del objeto como el método Dispose
del objeto invocarán el mismo método privado o protegido que liberará esos recursos. Cuando un tipo implementa IDisposable
es aconsejable llamar es Dispose
método cuando haya terminado con él o envuelva el objeto en un comunicado using
para permitir la liberación de los recursos nativos a ser determinista.
Así que volver a su pregunta. Todos los objetos gestionados serán recopilados por el GC, pero los recursos nativos no lo harán. Por lo tanto, los tipos pueden implementar un método de finalizador y esos objetos también implementarán típicamente la interfaz IDisposable
. Llamar al Dispose
en ellos liberará explícita y directamente esos recursos nativos.
Espero que esto tenga sentido.
¿Qué ha configurado el servidor para su parámetro de tiempo de espera de la sesión? –
He echado un vistazo y puedo ver que la sesión de mi sitio web está configurada como En proceso y hay un tiempo de espera contra la cookie asp, pero no puedo encontrar una específicamente para las sesiones. ¿Puedes aconsejar? – webnoob
Esta es la línea en mi archivo web.config para sesiones: - Parece que está configurado en 20 minutos. –
webnoob