nhibernate - memory leak

0

Cześć,

mam problem z wyciekiem pamięci w aplikacji.

W aplikacji ASP.NET Core cyklicznie odpalam zadania przez FluentSchedulera - proste zadanie - odczyt bazy danych, jeśli są jakieś nowe wpisy - przygotowanie raportu i wysłanie mailem na odczytanie z bazy adresy mail. Task jest odpalany co godzinę. Jednak po każdym wywołaniu taska aplikacja zajmuje ok 1 mb pamięci więcej.

Do taska przekazywany jest obiekt ConnectionFactory, z poziomu taska tworzę obiekt sesji, otwieram transakcję, sprawdzam dane, commit na transakcji, na końcu zawsze jest Dispose na sesji.

Ktoś ma pomysł co może być nie tak / co sprawdzić ?

0

1 MB na godzinę, to jest dla Ciebie memory leak?

1

Potrzebujesz jakiś memory profiler, robisz snapshota pamięci przed wywołaniem taska, potem po wywołaniu taska, za pomocą profilera robisz diffa, i dostajesz jak na dłoni jakie obiekty przybyły w pamięci.

A tak dla pewności że rzeczywiście masz memory leak, to by się przydało upewnić że rzeczywiście pełne GC miało miejsce (można wymusić), bo jeśli to zadanie jest naprawdę malutkie to istnieje wielkie prawdopodobieństwo że pełne GC nawet nie miało miejsca, bo GC uznał że szkoda czasu teraz na usuwanie śmieci skoro ciągle ma pod dostatkiem pamięci w której może alokować.

0

w zamyśle aplikacja ma sobie chodzić i raportować pewne rzeczy co najmniej przez najbliższe kilkanaście miesięcy. w ciągu tygodnia przyrost wykorzystanej pamięci jest w granicach 200 MB, niestety GC nie zwalnia wystarczająco dużo - czasami widać spadek wykorzystania, ale niestety sumarycznie wykorzystanie jest tylko większe i większe.

1

Ale widzisz te 200MB po tygodniu czy tylko sobie obliczyles?

0

widzę, klient zgłaszał kilka razy że aplikacja nie działa (rozwiązanie - restart apki), po którymś razie odpaliłem monitor wydajności, bo w logach nie ma żadnych wyjątków, i mam taki wynik

0

Czyli mogło zdarzyć się 1500 rzeczy zupełnie niezwiązanych w ogóle z pamięcią, więc skąd pomysł, że przyczyną jest jakiś minimalny wzrost zużycia pamięci?

0

nie mam 100% pewności, ale jest to jedyne cykliczne zadanie, pamięci ubywa cyklicznie, w równych, godzinnych odstępach, mniej więcej (różnica kilku sekund) w momencie wywołania zadania... stąd moje podejrzenia

0

Podejrzenia o co właściwie? Bo bez zdefiniowania "nie działa", to sobie generalnie wróżyć można.

1

Przyrost 200 MB na tydzień to jest nic. Normalnym jest w dużych aplikacjach (przy pewnych operacjach) przyrost 200 MB na sekundę :D Ale wtedy co jakiś czas GC zwalnia ładnie to wszystko. Zrób to, co napisał @neves dla spokojności, ale to na 99,9% nie będzie problem z pamięcią. Bardziej bym tu się skłaniał ku temu, że gdzieś wywala się wyjątek, którego nie przechwytujesz. Przechwyć wszystkie wyjątki i loguj je, wtedy myślę, że znajdziesz rozwiązanie. W .NetCore możesz posłużyć się NLogiem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0