2011-08-26 20 views
5

Mam bardzo złe problemy z pamięcią w aplikacji ASP.NET. Wydaje się, że za każdym razem, gdy strona się ładuje, stare poprzednie wystąpienie strony nie jest usuwane z pamięci. Jeśli naciśniesz klawisz F5 dziesięć razy, pamięć doda 10-20 MB do instancji. Podczas testowania warunków skrajnych i wydajności maksymalizowałoby to pamięć, a serwer WWW ulegnie awarii ...Strony ASP.NET nie zostały usunięte z pamięci

Uruchomiłem profilowanie pamięci ANTS i potwierdziłem, że za każdym razem, gdy strona jest wczytywana, stary instan pozostaje w pamięci. Wszystkie moje strony internetowe ASP.NET również korzystają ze strony wzorcowej. Ponownie, jeśli załadować stronę 10 razy, potem 10 wystąpień w internecie strona istnieje, jak również 10 wystąpień strony wzorcowej ...

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

Patrząc na wyniki mrówki Profiler, można zobaczyć to, że każde ponowne ładowanie strony dodaje około 320Kb do pamięci i to tylko strona internetowa, nawet nie biorąc pod uwagę strony wzorcowej. Moja aplikacja to aplikacja do ubezpieczenia na życie, która przechwytuje aplikacje, więc przechodzi przez około 30-40 stron. Więc możesz zobaczyć, dlaczego jest to masowe proble.

W jaki sposób mogę dowiedzieć się, co jest przechowywane w pamięci? Nie mam pojęcia, od czego zacząć ...: \ Wszystkie moje strony używają wtrysku Unity i Dependency do zarejestrowania usługi ... Nie jestem pewien czy muszę wyrejestrować te usługi po stronie page_onUnload.

EDIT

Dobra, udało mi się śledzić ten problem w dół. Powód, dla którego strona nie jest usuwana (GCollected), jest spowodowana zarejestrowaniem przez instancje usługi Unity, ale zostały one niezarejestrowane podczas wyładowywania strony. W ten sposób używam jedności na mojej stronie:

I wstrzyknąć usług za pośrednictwem publicznych właściwości

#region Services 

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

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

    #endregion 

Następnie strona startowych, robię gromadzeniu Unity:

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

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

Teraz oczywiście kiedy strona przechodzi przez swój normalny cykl życia i wywołuje Zwolnienie, nie może zostać rozładowana z powodu referencji wtrysku zależności ... Nie wiem tylko, jak wyrejestrować usługi (SummaryService, PortfolioService)

Próbowałem wywoływać następujące w OnUnload, ale to nic nie robi:

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

Odpowiedz

0

Problem został spowodowany przez Unity i to jest LifeTimeManager.Musiałem skorzystać z innej LifeTimeManager jedności, która w zasadzie zwraca nowy kontener za każdym razem, gdy strona robi buildup. Na stronie UnLoad strony na pojemniku wywoływane jest wyrzucenie i jest ono utylizowane, co uwalnia wszystkie linki do wstrzykniętych właściwości. To rozwiązało mój problem :)

1

Masz statyczne odniesienie do strony gdzieś i nie można jej usunąć.

+1

Jak ustalić, czy mam statyczne odwołanie do strony? Jakieś sposoby identyfikacji, który obiekt się do niego odwołuje? – FaNIX

0

Zdecydowanie zacznę od wyrejestrowania usług. Widziałem ogromne wycieki pamięci z powodu tego problemu (chociaż jedność nie była używana w tym przypadku).

Rozejrzyj się i sprawdź, czy używasz zmiennej strony w sposób, który uniemożliwia jej gromadzenie śmieci.

0

chciałbym sprawdzić, czy statyczny Colletion istnieje w dowolnym miejscu na stronie strona/Master Wystarczy zrobić wyszukiwania dla słowa statycznej (C#) lub dzielone (VB) na całym projekcie

Powiązane problemy