Mieliśmy skrypt konwersji obrazu działający na .NET 4.0, IIS 7, ASP.NET, 4 GB pamięci RAM serwera, który zmienia rozmiar dużych obrazów i dlatego potrzebuje dużo pamięci.
Pierwszy skrypt zwiększył zużycie pamięci do prawie 100%, nie pozostawiając praktycznie nic dla uruchomionego serwera SQL Server (który zrezygnował z pamięci do czasu uruchomienia na 20 MB zamiast zwykłych 900 MB).
W drugim skrypcie dodaliśmy GC.Collect() i (dla pewności) jednosekundowy wątek uśpiony po każdym cyklu i wszystko wróciło do normy.
Pytanie: czy nie jest to wada w zarządzaniu pamięcią .NET? Czy system nie powinien przyjrzeć się bliżej temu, co dzieje się z dostępną pamięcią, spowolnić działania i posprzątać?
3 odpowiedzi
Zgodnie z dokumentacją:
Wyrzucanie elementów bezużytecznych odbywa się automatycznie, gdy żądanie pamięci nie może zostać spełnione przy użyciu dostępnej wolnej pamięci.
Zakładam, że ta sytuacja nie została spełniona, ponieważ zamiast tego SQL Server wycofuje się. Jeśli chodzi o bycie błędem; doktorzy sugerują, że jest to zgodne z projektem.
Tak garbage collection wykonuje swoje zadanie, gdy pamięć nie wystarcza do następnej operacji. Ale.
GC nie ma wpływu na obiekty, które są zadeklarowane jako globalne lub używane przez obiekty globalne. Więc staraj się, aby twoje obiekty były lokalne, jeśli to możliwe.
Może to być usterka w zarządzaniu pamięcią .Net. Aby mieć pewność, potrzebujemy Twojego kodu.
Ale najpierw przyjrzę się Twojemu kodowi pod kątem przypadków, w których jednorazowe zasoby nie są prawidłowo usuwane. Wiadomo, że powoduje to wycieki pamięci i jest przyczyną istnienia interfejsu IDisposable.
Podobne pytania
Nowe pytania
.net
NIE używaj w przypadku pytań dotyczących .NET Core - zamiast tego użyj [.net-core]. Platforma .NET to struktura oprogramowania zaprojektowana głównie dla systemu operacyjnego Microsoft Windows. Obejmuje implementację biblioteki klas podstawowych, środowiska uruchomieniowego języka wspólnego (powszechnie określanego jako CLR), systemu typu wspólnego (powszechnie określanego jako CTS) i środowiska wykonawczego języka dynamicznego. Obsługuje wiele języków programowania, w tym C #, VB.NET, F # i C ++ / CLI.