Udostępnij za pośrednictwem


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 sytuacjach, takich jak gdy aplikacja pobiera dane lub wyświetla zawartość, pełne odzyskiwanie pamięci może wystąpić w krytycznym czasie i utrudniać 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 "małego" opóźnienia oznacza, że moduł odśmiecające śmieci włamuje się mniej w aplikacji. 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. W dłuższych okresach, jeśli system jest pod ciśnieniem pamięci, moduł odśmiecywania pamięci wyzwoli zbieranie, co może na krótko wstrzymać aplikację i zakłócić operację o krytycznym czasie. To ustawienie jest dostępne tylko dla odzyskiwania pamięci stacji roboczej.

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

W okresach małych opóźnień kolekcje generacji 2 są pomijane, chyba że wystąpią następujące czynności:

  • 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 odzyskiwanie pamięci w tle jest wyłączone, jest to tryb domyślny dla stacji roboczej i odzyskiwania pamięci 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 odśmieceniu pamięci mogą być destrukcyjne. Na przykład aplikacje renderujące animacje lub funkcje pozyskiwania danych.
SustainedLowLatency W przypadku aplikacji, które mają operacje wrażliwe na czas dla zawartego, ale potencjalnie dłuższego czasu, w którym przerwy w odśmieceniu pamięci mogą być zakłócane. Na przykład aplikacje, które wymagają szybkich czasów odpowiedzi w miarę zmian danych rynkowych w godzinach handlu.

Ten tryb powoduje większy rozmiar sterty zarządzanej niż inne tryby. 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:

  • Zachowaj możliwie najkrótszy okres czasu z małym opóźnieniem.

  • 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ż odzyskiwanie pamięci jest mniejszej liczby 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. LatencyMode Ponieważ ustawienie właściwości jest całego procesu, OutOfMemoryException wyjątki można wygenerować w dowolnym wątku przydzielającym.

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

  • Kolekcje generacji 2 można wymusić w okresie małego opóźnienia, wywołując metodę GC.Collect(Int32, GCCollectionMode) .

Zobacz też