2017-03-21 43 views
5

Nie mogę zrozumieć, dlaczego rdzeń Asp.net nie zbiera śmieci. W zeszłym tygodniu uruchomiłem usługę sieciową przez kilka dni, a moje wykorzystanie pamięci sięgnęło 20 GB. Wydaje się, że GC nie działa. Aby przetestować to, napisałem bardzo prostą metodę, która zwraca dużą kolekcję ciągów. Aplikacja zaczęła używać tylko 124 MB, ale za każdym razem, gdy wywoływałam metodę sieciową, zużycie pamięci stale rosło, aż osiągnęło 411 MB. Byłoby wyżej, gdybym nadal dzwonił do metody internetowej. Ale postanowiłem przerwać testowanie.Asp.net Core nie zbiera śmieci

enter image description here

Czy ktoś wie dlaczego GC nie działa? Jak widać z monitora wydajności, wywołano GC (żółty znacznik na wykresie). Ale nie zbierało śmieci z pamięci. Sądzę, że GC chętnie zbierze wszystko, co nie miało na to odniesienia.

Każda pomoc będzie WSPANIAŁA doceniona. Dzięki! :)

+0

Nie sądzę, że jest to odpowiedni test do zbierania śmieci. Przyczyna .net tworzy stertę w pamięci, gdy potrzebuje więcej pamięci. Jednak po zebraniu nie zmniejsza natychmiast sterty. Zrobi to z biegiem czasu. Powodem zwolnienia sterty jest większe zapotrzebowanie na zasoby w porównaniu do tworzenia. Jednak powinno to być ponowne używanie tej samej sterty podczas wielokrotnego wywoływania. Czy możesz spróbować bez asynchronizacji? Tylko zobaczyć, co się dzieje? –

+0

Witam @ HenrikBøgelundLavstsen, usunąłem metodę asynchronicznej sieci i ponownie testuję, ale tym razem jako metodę synchroniczną. Nadal mam ten sam problem z pamięcią. Wygląda więc na to, że nie jest to problem asynchroniczny. Tak jak powiedziałeś, ta sama pamięć powinna być ponownie użyta przy każdym wywołaniu. ale przy każdym wywołaniu wzrasta użycie pamięci. To trochę niepokojące. – Zorthgo

+0

Testowałem również zarówno z IIS, jak iz Kestrel. Niestety oba wykazują to samo zachowanie. – Zorthgo

Odpowiedz

0

Serwer buforuje dane wyjściowe, 100 000 000 * 4 znaki ~ 411 MB.