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) .