Używam dużej witryny ASP.net 4.0. Korzysta z popularnego systemu zarządzania treścią .Net, ma tysiące elementów treści, setki równoczesnych użytkowników - jest po prostu ciężką stroną internetową.Zrozumienie wycieków pamięci w ASP.net przy użyciu Profiler pamięci RedGate
W ciągu jednego dnia wykorzystanie pamięci procesu roboczego IIS7 może wzrosnąć do 8-10 GB. Serwer ma 16 GB i jest obecnie skonfigurowany do recyklingu puli aplikacji raz dziennie.
Otrzymuję presję, aby zmniejszyć zużycie pamięci. Duża część wykorzystania pamięci wynika z buforowania dużych ciągów danych, ale interwał pamięci podręcznej jest ustawiony tylko na 5-10 minut, więc te ciągi powinny w końcu wygasnąć z pamięci.
Jednak po uruchomieniu programu RedGate Memory Profiler widzę, co uważam za wyciek pamięci. Przefiltrowałem wyniki mojej listy wystąpień za pomocą obiektów, które "są przechowywane w pamięci wyłącznie przez Unieaktywnione Obiekty" (czytałem na forum RedGate, że w ten sposób można znaleźć wycieki pamięci). To dało mi długą listę ciągów, które są przechowywane w pamięci.
Dla każdego łańcucha używam wykresu zatrzymania instancji, aby zobaczyć, co trzyma go w pamięci. Obiekty System.string wydają się być w pewnym momencie buforowane przez System.Web.Caching.CacheDependency. Jeśli śledzę cały wykres, przechodzi przez różne inne klasy, w tym System.Collections.Specialized.ListDictionary, aż osiągnie System.Web.FileMonitor. Ma to pewien sens, ponieważ łańcuchy są ścieżkami do pliku (obrazy/pliki PDF/itd.).
Wygląda na to, że CMS buforuje ścieżki do plików, ale te buforowane obiekty są następnie "wyciekane". Z biegiem czasu to buduje i zżera pamięć RAM.
Przepraszam, że to długo trwa ... Czy istnieje sposób, aby zatrzymać te wycieki pamięci? Czy możesz je wyczyścić bez konieczności recyklingu puli aplikacji? Czy mogę znaleźć klasę/kod robiący buforowanie, aby sprawdzić, czy mogę naprawić wyciek?
Już teraz przetwarzamy pulę aplikacji, ale klient postrzega to jako pracę, a nie rozwiązanie. Mówią z uzasadnieniem, że aplikacja nie powinna zużywać tak dużo pamięci. –
'System.Web.Caching.CacheDependency' jest raczej użycie buforowania ASP.NET niż pamięć podręczną w sesji. Ta pamięć podręczna jest w pewien sposób statyczna i udostępniana wszystkim użytkownikom, z wyjątkiem sytuacji, gdy klucze pamięci podręcznej są specyficzne dla użytkownika (w ogóle nie są zalecane i mogą powodować tego typu problemy). Recykling puli lub obniżenie limitu czasu sesji ogranicza tylko czas życia aplikacji, a nie wykorzystanie pamięci. – JoeBilly