Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Garbage collector jest samodostosowujący się i może działać w wielu różnych scenariuszach. Można jednak ustawić typ odzyskiwania pamięci na podstawie cech obciążenia. CLR zapewnia następujące typy zbierania nieużytków:
Odzyskiwanie pamięci stacji roboczej (GC), które jest przeznaczone dla aplikacji klienckich. Jest to domyślna wersja GC dla autonomicznych aplikacji. Na przykład w aplikacjach hostowanych przez ASP.NET, host ustala domyślny typ GC.
Zbieranie śmieci na stacji roboczej może być współbieżne lub szeregowe. Współbieżne (lub w tle) zbieranie śmieci umożliwia zarządzanym wątkom kontynuowanie operacji podczas zbierania śmieci. Odzyskiwanie pamięci w tle zastępuje współbieżne odzyskiwanie pamięci w środowisku .NET Framework 4 i nowszych wersjach.
Zbiórka śmieci na serwerze, która jest przeznaczona dla aplikacji serwerowych wymagających wysokiej przepustowości i skalowalności.
W .NET Core odzyskiwanie pamięci serwera może być współbieżne lub wykonywane w tle.
W programie .NET Framework w wersji 4.5 i późniejszych, odzyskiwanie pamięci serwera może być niewspółbieżne lub działać w tle. W programie .NET Framework 4 i poprzednich wersjach odzyskiwanie pamięci serwera nie jest współbieżne.
Na poniższej ilustracji przedstawiono dedykowane wątki, które wykonują zbieranie śmieci na serwerze.
Zagadnienia dotyczące wydajności
Stacja robocza GC
Poniżej przedstawiono zagadnienia dotyczące wątków i wydajności zbierania śmieci na stacjach roboczych:
Kolekcja odbywa się w wątku użytkownika, który wyzwolił zbieranie śmieci i pozostaje na takim samym priorytecie. Ponieważ wątki użytkownika zwykle działają z normalnym priorytetem, mechanizm odśmiecania (uruchamiany w wątku z normalnym priorytetem) musi konkurować z innymi wątkami o czas procesora. (Wątki wykonujące kod natywny nie są wstrzymywane w trybie zbierania śmieci ani na serwerze, ani na stacji roboczej).
Oczyszczanie pamięci stacji roboczej jest zawsze używane na komputerze, który ma tylko jeden logiczny procesor, niezależnie od ustawień konfiguracji.
GC serwera
Poniżej przedstawiono zagadnienia dotyczące wątków i wydajności procesu odśmiecania pamięci na serwerze:
Kolekcja odbywa się w wielu dedykowanych wątkach. W systemie Windows te wątki działają na
THREAD_PRIORITY_HIGHEST
poziomie priorytetu.Sterty i dedykowane wątki do wykonywania odzyskiwania pamięci są udostępniane dla każdego logicznego procesora, a wszystkie sterty są zbierane w tym samym czasie. Każda sterta zawiera małą stertę obiektów i dużą stertę obiektów, a wszystkie sterty mogą być dostępne za pomocą kodu użytkownika. Obiekty na różnych stosach mogą się odwoływać do siebie nawzajem.
Ponieważ wiele wątków odzyskiwania pamięci współdziała ze sobą, odzyskiwanie pamięci serwera jest szybsze niż odzyskiwanie pamięci stacji roboczej na tej samej stercie o tym samym rozmiarze.
Odśmiecanie pamięci serwera często posiada segmenty o większym rozmiarze. Jest to jednak tylko uogólnienie: rozmiar segmentu jest specyficzny dla implementacji i może ulec zmianie. Nie zakładaj, jakie rozmiary segmentów są przydzielane przez kolektor śmieci podczas optymalizacji aplikacji.
Zbieranie nieużywanej pamięci przez serwer jest procesem obciążającym zasoby. Załóżmy na przykład, że istnieje 12 procesów korzystających z GC serwera uruchomionego na komputerze z czterema procesorami logicznymi. Jeśli wszystkie procesy przypadkiem równocześnie zbierają śmieci, będą się wzajemnie zakłócać, ponieważ na tym samym logicznym procesorze CPU zaplanowano 12 wątków. Jeśli procesy są aktywne, to nie najlepszy pomysł, aby wszystkie używały serwerowego GC.
Jeśli używasz setek wystąpień aplikacji, rozważ użycie odzyskiwania pamięci stacji roboczej z wyłączonym współbieżnym odzyskiwaniem pamięci. Spowoduje to mniej przełączania kontekstu, co może poprawić wydajność.