2011-08-26 19 views
5

He estado teniendo problemas de memoria realmente malos con una aplicación ASP.NET. Parece que cada vez que se carga la página, la instancia previa anterior de la página no se elimina de la memoria. Si presiona F5 diez veces, la memoria agrega 10-20MB a la instancia. Durante las pruebas de estrés y rendimiento, esto maximizaría la memoria y el servidor web se bloqueará ...ASP.NET Páginas no eliminadas de la memoria

Ejecuté el perfil de memoria ANTS y ​​confirmó que cada vez que se carga una página, el archivo antiguo permanece en la memoria. Todas mis páginas web ASP.NET también usan una página maestra. De nuevo, si me carga la página 10 veces, luego de 10 casos de la web existe la página, así como 10 casos de la página maestra ...

http://oi51.tinypic.com/21msy2g.jpg

cuanto a los resultados hormigas de perfil, se puede ver que cada recarga de página agrega alrededor de 320 Kb a la memoria, y eso es solo la página web, sin siquiera tener en cuenta la página maestra. Mi aplicación es una aplicación de seguro de vida que captura aplicaciones, por lo que pasa de 30 a 40 páginas. Entonces puedes ver por qué esto es un problema masivo.

¿Cómo podría averiguar qué es lo que mantiene la página en la memoria? No tengo idea de dónde empezar ...: \

Todas mis páginas usan la inyección de Unity and Dependency para registrar el servicio ... No estoy seguro de si debo cancelar el registro de estos servicios después de page_onUnload.

EDITAR

bien, he logrado seguir la expedición hacia abajo. El motivo por el que no se elimina la página (GCollected) se debe a las instancias de servicio de Unity que se registraron pero no se registraron durante la descarga de la página. Esta es la forma en que estoy usando la unidad en mi página:

me inyecto los servicios a través de las propiedades públicas

#region Services 

    [Dependency] 
    public ReviewReportService SummaryService { get; set; } 

    [Dependency] 
    public Portfolios.PortfolioService PortfolioService { get; set; } 

    #endregion 

A continuación, la página de inicio, que hago la acumulación de la Unidad:

protected override void OnInit(EventArgs e) 
    { 
     base.OnInit(e); 

        ApplicationContainer.BuildUp(this.Context, this); 
      } 

Ahora, evidentemente, cuando la página pasa por su ciclo de vida normal y llama a Descargar, no se puede descargar debido a la referencia de inyección de dependencia ... No estoy seguro de cómo cancelar el registro de los servicios (SummaryService, PortfolioService)

Intenté llamar a lo siguiente en OnUnload pero no hace nada:

ApplicationContainer.GetContainer (Context) .Teardown (this);

Respuesta

0

El problema se debía a la UNIDAD y es LifeTimeManager.Tuve que hacer uso de LifeTimeManager, una unidad diferente que básicamente devuelve un nuevo contenedor cada vez que una página realiza una acumulación. Al deshacer la carga de la página, se invoca el desmontaje en el contenedor y se desecha, lo que libera todos los enlaces a las propiedades inyectadas. Esto resolvió mi problema :)

1

Tiene una referencia estática a la página en alguna parte y no se puede eliminar.

+1

¿Cómo puedo determinar si tengo una referencia estática a la página? ¿Alguna forma de identificar qué objeto está haciendo referencia a él? – FaNIX

0

Definitivamente comenzaré por anular el registro de los servicios. He visto pérdidas masivas de memoria debido a este mismo problema (aunque la unidad no se usaba en ese caso).

Además, mire a su alrededor y vea si está usando la variable de la página de una manera que impide que se la recoja.

0

Me gustaría comprobar si un colletion estática existe en cualquier lugar de la página de la página/maestro Sólo hacer una búsqueda de la palabra estática (C#) o compartida (VB) en todo el proyecto

Cuestiones relacionadas