Odzyskiwanie pamięci stacji roboczej i serwera

Moduł odśmiecania pamięci jest samonastrajania 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 odzyskiwania pamięci:

  • 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 przypadku aplikacji hostowanych przez ASP.NET host określa domyślny smak GC.

    Odzyskiwanie pamięci stacji roboczej może być współbieżne lub niebieżne. Współbieżne (lub w tle) odzyskiwanie pamięci umożliwia zarządzanym wątkom kontynuowanie operacji podczas odzyskiwania pamięci. Odzyskiwanie pamięci w tle zastępuje współbieżne odzyskiwanie pamięci w programie .NET Framework 4 i nowszych wersjach.

  • Odzyskiwanie pamięci serwera, które jest przeznaczone dla aplikacji serwera wymagających wysokiej przepływności i skalowalności.

    • W programie .NET Core odzyskiwanie pamięci serwera może nie być współbieżne lub w tle.

    • W programie .NET Framework 4.5 lub nowszym odzyskiwanie pamięci serwera może nie być współbieżne lub 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ą odzyskiwanie pamięci na serwerze:

Server Garbage Collection Threads

Zagadnienia dotyczące wydajności

Stacja robocza GC

Poniżej przedstawiono zagadnienia dotyczące wątków i wydajności odzyskiwania pamięci stacji roboczej:

  • Kolekcja odbywa się w wątku użytkownika, który wyzwolił odzyskiwanie pamięci i pozostaje o tym samym priorytetu. Ponieważ wątki użytkownika zwykle działają z normalnym priorytetem, moduł odśmieceń pamięci (uruchamiany w normalnym wątku priorytetu) musi konkurować z innymi wątkami w czasie procesora CPU. (Wątki uruchamiające kod macierzysty nie są zawieszone na serwerze lub na stacji roboczej odzyskiwania pamięci).

  • Odzyskiwanie pamięci stacji roboczej jest zawsze używane na komputerze, który ma tylko jeden logiczny procesor CPU, niezależnie od ustawienia konfiguracji.

GC serwera

Poniżej przedstawiono zagadnienia dotyczące wątków i wydajności odzyskiwania pamięci serwera:

  • Kolekcja odbywa się w wielu dedykowanych wątkach. W systemie Windows te wątki działają na THREAD_PRIORITY_HIGHEST poziomie priorytetu.

  • Sterta i dedykowany wątek do wykonywania odzyskiwania pamięci są udostępniane dla każdego logicznego procesora CPU, a sterta są zbierane w tym samym czasie. Każda sterta zawiera mały stertę obiektu i duży stertę obiektu, a wszystkie sterta mogą być dostępne za pomocą kodu użytkownika. Obiekty na różnych stercie 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.

  • Odzyskiwanie pamięci serwera często ma większy rozmiar segmentów. Jest to jednak tylko uogólnienie: rozmiar segmentu jest specyficzny dla implementacji i może ulec zmianie. Nie zakładaj rozmiaru segmentów przydzielonych przez moduł odśmiecania pamięci podczas dostrajania aplikacji.

  • Odzyskiwanie pamięci serwera może intensywnie obciążać 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 w tym samym czasie zbierają śmieci, będą one zakłócać wzajemnie, ponieważ na tym samym logicznym procesorze cpu zaplanowano 12 wątków. Jeśli procesy są aktywne, nie jest dobrym pomysłem, aby wszystkie używały GC serwera.

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ść.

Zobacz też