.NET bardzo efektywnie zarządza wyrzucaniem śmieci. W przypadku typów implementujących IDisposable
dobrze jest wywołać metodę Dispose
, prawdopodobnie nie jest to Twój problem. Przecieki pamięci mogą wystąpić w .NET z wielu powodów. Oto kilka:
- Buforujesz za dużo danych na użytkownika w Sesji.
- Buforujesz za dużo danych na poziomie aplikacji w pamięci podręcznej aplikacji lub w zmiennej statycznej, takiej jak słownik.
- Możesz przechowywać formanty internetowe (lub kontrolki użytkownika) na poziomie sesji lub aplikacji.
- Przechwytuje instancje do zdarzeń na typach statycznych lub do typów, które są przywoływane (ponieważ są przechowywane w pamięci podręcznej).
Mam nadzieję, że dzięki temu dowiesz się, gdzie szukać.
AKTUALIZACJA: Powinieneś obejrzeć this video o debugowaniu ASP.NET.
UPDATE 2: Twój komentarz na temat mojej odpowiedzi na następujące pytanie. CLR będzie zbierać wszystkie zarządzane pamięci, dlatego wszystkie obiekty utworzone przy użyciu new
zostaną zebrane. W tym sensie nie ma znaczenia, czy obiekt implementuje IDisposable
czy nie. Istnieje jednak wiele razy, że musisz użyć zasobów macierzystych (takich jak uchwyty plików, uchwyty graficzne, połączenia z bazami danych, wykorzystanie natywnej - tej niezarządzanej - pamięci) bezpośrednio lub pośrednio. Środowisko CLR nie wie, jak zwolnić te zasoby. Do tego .NET ma pojęcie finalizatorów. Finalizator to wirtualna metoda, którą może zaimplementować programista danej klasy. Gdy to zrobisz, CLR wywoła tę metodę po tym, jak tego typu instancja zostanie pozbawiona odwołań i zanim zostanie pobrana. Finalizery zazwyczaj zawierają logikę, która udostępnia te zasoby. Innymi słowy, gdy typ wymaga zasobów natywnych, zwykle ma on metodę finalizatora, która pozwala typowi zwolnić te zasoby.
Co dotyczy CLR, historia kończy się tutaj. CLR nie ma specyficznej obsługi obiektów, które implementują interfejs IDisposable
. Odśmiecacz .NET ma jednak charakter nieokreślony. Oznacza to, że nie wiesz, kiedy działa i czy działa. Oznacza to, że może upłynąć sporo czasu zanim twoje natywne zasoby zostaną oczyszczone (ponieważ finalizator zostanie wywołany dopiero po pobraniu). W przypadku wielu zasobów konieczne jest jednak ich zwolnienie, gdy tylko skończysz z nimi. Na przykład często kończy się połączenie z bazą danych, gdy ich nie zamykasz lub gdy pracujesz z GDI + w .NET za pomocą przestrzeni nazw System.Drawing).
Z tego powodu wprowadzono interfejs IDisposable
. Znowu CLR i garbage collector nie patrzą na ten interfejs. Jest to umowa między typem a jej użytkownikami, umożliwiająca użytkownikom bezpośrednie uwolnienie podstawowych zasobów obiektu. W normalnym projekcie zarówno finalizator obiektu, jak i metoda obiektu będą wywoływać tę samą prywatną lub chronioną metodę, która zwolni te zasoby. Gdy typ implementuje IDisposable
, rozsądnie jest wywołać metodę Dispose
po zakończeniu pracy lub zawinięciu obiektu w instrukcji using
, aby zezwolić na determinację zasobów natywnych.
Powróć więc do pytania. Wszystkie zarządzane obiekty będą zbierane przez GC, ale zasoby natywne nie będą. Dlatego typy mogą implementować metodę finalizatora, a te obiekty będą również zwykle implementować interfejs IDisposable
. Wywołanie na nich Dispose
spowoduje jawne i bezpośrednie zwolnienie tych zasobów macierzystych.
Mam nadzieję, że to ma sens.
Co skonfigurował serwer z parametrem limitu czasu sesji? –
Spojrzałem i widzę, że sesja dla mojej witryny jest ustawiona na "In Proccess" i nie ma limitu czasu w stosunku do pliku cookie asp, ale nie mogę znaleźć konkretnej sesji. Możesz doradzić? – webnoob
To jest wiersz w moim pliku web.config dla sesji: - Wydaje się, że jest ustawiony na 20 minut. –
webnoob