Udostępnij przez


Tryby opóźnienia

Aby odzyskać obiekty, moduł odśmiecania pamięci (GC) musi zatrzymać wszystkie wątki wykonawcze w aplikacji. Okres, w którym moduł odśmiecywania pamięci jest aktywny, jest określany jako jego opóźnienie.

W niektórych przypadkach, takich jak gdy aplikacja pobiera dane lub wyświetla zawartość, pełne czyszczenie pamięci może wystąpić w krytycznym momencie i obniżać wydajność. Możesz dostosować natrętność modułu odśmiecającego śmieci, ustawiając GCSettings.LatencyMode właściwość na jedną z System.Runtime.GCLatencyMode wartości.

Ustawienia małych opóźnień

Użycie ustawienia "niskiego" opóźnienia oznacza, że moduł odśmiecania mniej ingeruje w aplikację. Odzyskiwanie pamięci jest bardziej konserwatywne w kwestii odzyskiwania pamięci.

Wyliczenie System.Runtime.GCLatencyMode zapewnia dwa ustawienia małych opóźnień:

  • GCLatencyMode.LowLatency pomija kolekcje generacji 2 i wykonuje tylko kolekcje generacji 0 i 1. Można go używać tylko przez krótki czas. Przez dłuższe okresy czasu, jeśli system jest pod presją pamięci, garbage collector zainicjuje proces oczyszczania, co może krótko wstrzymać działanie aplikacji i zakłócić operację krytyczną czasowo. To ustawienie jest dostępne tylko dla odzyskiwania pamięci stacji roboczej.

  • GCLatencyMode.SustainedLowLatency pomija kolekcje generacji 2 na pierwszym planie i wykonuje tylko kolekcje generacji 0, 1 oraz kolekcje generacji 2 w tle. Może być używany przez dłuższy czas i jest dostępny zarówno dla stacji roboczej, jak i dla zbierania śmieci serwera. Tego ustawienia nie można użyć, jeśli odzyskiwanie pamięci w tle jest wyłączone.

Podczas okresów niskiej latencji kolekcje generacji 2 są pomijane, chyba że wystąpią następujące warunki:

  • System otrzymuje powiadomienie o niskiej ilości pamięci z systemu operacyjnego.

  • Kod aplikacji wywołuje kolekcję, wywołując GC.Collect metodę i określając 2 dla parametru generation .

Scenariusze

W poniższej tabeli wymieniono scenariusze aplikacji dotyczące używania GCLatencyMode wartości:

Tryb opóźnienia Scenariusze aplikacji
Batch W przypadku aplikacji, które nie mają interfejsu użytkownika ani operacji po stronie serwera.

Gdy zarządzanie pamięcią w tle jest wyłączone, jest to tryb domyślny dla zarządzania pamięcią stacji roboczej i serwera. Batch tryb zastępuje również ustawienie gcConcurrent , czyli uniemożliwia tworzenie kolekcji w tle lub współbieżnych.
Interactive W przypadku większości aplikacji, które mają interfejs użytkownika.

Jest to tryb domyślny dla stacji roboczej i odzyskiwania pamięci serwera. Jeśli jednak aplikacja jest hostowana, ustawienia modułu odśmiecenia pamięci procesu hostingu mają pierwszeństwo.
LowLatency W przypadku aplikacji, które mają krótkoterminowe, wrażliwe na czas operacje, podczas których przerwy w działaniu kolektora śmieci mogą zakłócić działanie. Na przykład aplikacje renderujące animacje lub funkcje pozyskiwania danych.
SustainedLowLatency W przypadku aplikacji, które mają operacje wrażliwe na czas przez ograniczony, ale potencjalnie dłuższy okres, w trakcie którego przerwy powodowane przez odśmiecacz pamięci mogą być problematyczne. Na przykład aplikacje, które wymagają szybkich czasów odpowiedzi w miarę zmian danych rynkowych w godzinach handlu.

Ten tryb powoduje, że rozmiar zarządzanej sterty jest większy niż w przypadku innych trybów. Ponieważ nie kompaktuje zarządzanej sterty, możliwa jest większa fragmentacja. Upewnij się, że jest dostępna wystarczająca ilość pamięci.

Wskazówki dotyczące używania małych opóźnień

W przypadku korzystania z trybu GCLatencyMode.LowLatency należy wziąć pod uwagę następujące wskazówki:

  • Utrzymaj czas z małym opóźnieniem jak najkrótszy.

  • Unikaj przydzielania dużej ilości pamięci w okresach małych opóźnień. Powiadomienia o małej ilości pamięci mogą wystąpić, ponieważ proces oczyszczania pamięci odzyskuje mniej obiektów.

  • W trybie małych opóźnień zminimalizuj liczbę nowych alokacji, w szczególności alokacje na dużą stertę obiektów i przypięte obiekty.

  • Należy pamiętać o wątkach, które mogą być przydzielane. Ponieważ ustawienie właściwości obowiązuje w całym procesie, wyjątki mogą być generowane w dowolnym wątku dokonującym alokacji.

  • Umieść kod o małych opóźnieniach w ograniczonych regionach wykonania. Aby uzyskać więcej informacji, zobacz Ograniczone regiony wykonywania.

  • W okresie niskiej latencji można wymusić kolekcje generacji 2, wywołując metodę GC.Collect(Int32, GCCollectionMode).

Zobacz także