System.GC, klasa

Ten artykuł zawiera dodatkowe uwagi dotyczące dokumentacji referencyjnej dla tego interfejsu API.

Klasa GC steruje modułem odśmiecającym śmieci. Moduł odśmieceń pamięci jest składnikiem środowiska uruchomieniowego języka wspólnego, który kontroluje alokację i zwalnianie pamięci zarządzanej. Metody w tej klasie mają wpływ na to, kiedy odzyskiwanie pamięci jest wykonywane na obiekcie i kiedy zasoby przydzielone przez obiekt są zwalniane. Właściwości w tej klasie zawierają informacje o całkowitej ilości pamięci dostępnej w systemie i kategorii wiekowej lub generacji pamięci przydzielonej do obiektu.

Moduł odśmieceń pamięci śledzi i odzyskuje obiekty przydzielone w pamięci zarządzanej. Okresowo moduł odśmieceń pamięci wykonuje odzyskiwanie pamięci w celu odzyskania pamięci przydzielonej do obiektów, dla których nie ma prawidłowych odwołań. Odzyskiwanie pamięci odbywa się automatycznie, gdy żądanie pamięci nie może być spełnione przy użyciu dostępnej wolnej pamięci. Alternatywnie aplikacja może wymusić odzyskiwanie pamięci przy użyciu Collect metody .

Odzyskiwanie pamięci składa się z następujących kroków:

  1. Moduł odśmieceń pamięci wyszukuje obiekty zarządzane, do których odwołuje się kod zarządzany.
  2. Moduł odśmieceń pamięci próbuje sfinalizować obiekty, do których nie odwołuje się odwołanie.
  3. Moduł odśmiecający elementy bezużyteczne zwalnia obiekty, do których nie odwołuje się odwołanie i odzyskuje ich pamięć.

Zasoby niezarządzane

Podczas zbierania moduł odśmieceń pamięci nie zwolni obiektu, jeśli znajdzie co najmniej jedno odwołanie do obiektu w kodzie zarządzanym. Jednak moduł odśmiecanie pamięci nie rozpoznaje odwołań do obiektu z niezarządzanego kodu i może zwolnić obiekty, które są używane wyłącznie w kodzie niezarządzanym, chyba że jawnie tego nie uniemożliwiono. Metoda KeepAlive udostępnia mechanizm, który uniemożliwia modułowi odśmiecanie pamięci zbieranie obiektów, które są nadal używane w kodzie niezarządzanym.

Oprócz alokacji pamięci zarządzanej implementacje modułu odśmiecający pamięć nie obsługują informacji o zasobach przechowywanych przez obiekt, takich jak dojścia plików lub połączenia bazy danych. Gdy typ używa niezarządzanych zasobów, które muszą zostać zwolnione przed odzyskaniem wystąpień typu, typ może zaimplementować finalizator.

W większości przypadków finalizatory są implementowane przez Object.Finalize zastąpienie metody, jednak typy napisane w języku C# lub C++ implementują destruktory, które kompilatory zamieniają się w przesłonięcia Object.Finalize. W większości przypadków, jeśli obiekt ma finalizator, moduł odśmiecania pamięci wywołuje go przed zwolnieniem obiektu. Jednak moduł odśmieceń pamięci nie jest wymagany do wywoływania finalizatorów we wszystkich sytuacjach; na przykład SuppressFinalize metoda jawnie uniemożliwia wywoływanie finalizatora obiektu. Ponadto moduł odśmieceń pamięci nie jest wymagany do używania określonego wątku do finalizowania obiektów ani zagwarantowania kolejności wywoływania finalizatorów dla obiektów odwołujących się do siebie, ale w przeciwnym razie są dostępne do odzyskiwania pamięci.

W scenariuszach, w których zasoby muszą być zwalniane w określonym czasie, klasy mogą implementować IDisposable interfejs, który zawiera IDisposable.Dispose metodę, która wykonuje zadania zarządzania zasobami i oczyszczania. Klasy implementujące Dispose muszą określać w ramach kontraktu klasy, jeśli i kiedy odbiorcy klasy wywołają metodę w celu oczyszczenia obiektu. Moduł odśmiecania pamięci domyślnie nie wywołuje Dispose metody . Jednak implementacje Dispose metody mogą wywoływać metody w klasie w GC celu dostosowania zachowania finalizacji modułu odśmiecania pamięci.

Aby uzyskać więcej informacji na temat finalizacji obiektów i wzorca usuwania, zobacz Czyszczenie zasobów niezarządzanych.

Starzenie się i generowanie obiektów

Moduł odśmieceń pamięci w środowisku uruchomieniowym języka wspólnego obsługuje starzenie się obiektów przy użyciu pokoleń. Generacja to jednostka miary względnego wieku obiektów w pamięci. Numer generacji lub wiek obiektu wskazuje generację, do której należy obiekt. Obiekty utworzone ostatnio są częścią nowszych generacji i mają numery niższej generacji niż obiekty utworzone wcześniej w cyklu życia aplikacji. Obiekty w najnowszej generacji są w generacji 0. Ta implementacja modułu odśmiecniania pamięci obsługuje trzy generacje obiektów, generacje 0, 1 i 2. Wartość właściwości można pobrać MaxGeneration , aby określić maksymalną liczbę generacji obsługiwaną przez system.

Starzenie się obiektów umożliwia aplikacjom kierowanie odzyskiwania pamięci w określonym zestawie generacji, a nie wymaganie, aby moduł odśmiecający pamięci oceniał wszystkie generacje. Przeciążenia Collect metody, która zawiera generation parametr, umożliwiają określenie najstarszej generacji, która ma być wyrzucana śmieci.

Brak możliwości odzyskiwania pamięci

Moduł odśmieceń pamięci obsługuje tryb opóźnienia regionu GC, który może być używany podczas wykonywania ścieżek krytycznych, w których odzyskiwanie pamięci może niekorzystnie wpłynąć na wydajność aplikacji. Tryb opóźnienia regionu GC nie wymaga określenia ilości pamięci, którą można przydzielić bez zakłóceń z modułu odśmiecającego pamięci. Jeśli środowisko uruchomieniowe może przydzielić tę pamięć, środowisko uruchomieniowe nie będzie wykonywać odzyskiwania pamięci, gdy kod w ścieżce krytycznej jest wykonywany.

Należy zdefiniować początek ścieżki krytycznej bez regionu GC przez wywołanie jednego z przeciążeń obiektu TryStartNoGCRegion. Należy określić koniec ścieżki krytycznej, wywołując metodę EndNoGCRegion .

Nie można zagnieżdżać TryStartNoGCRegion wywołań metody i należy wywołać metodę EndNoGCRegion tylko wtedy, gdy środowisko uruchomieniowe nie jest obecnie w trybie opóźnienia regionu GC. Innymi słowy, nie należy wywoływać TryStartNoGCRegion wiele razy (po pierwszym wywołaniu metody kolejne wywołania nie powiedzie się) i nie należy oczekiwać, aby EndNoGCRegion wywołania zakończyły się powodzeniem tylko dlatego, że pierwsze wywołanie TryStartNoGCRegion zakończyło się pomyślnie.