Odzyskiwanie pamięci w tle

W przypadku odzyskiwania pamięci w tle (GC) generacje efemeryczne (0 i 1) są zbierane zgodnie z potrzebami, podczas gdy zbieranie generacji 2 jest w toku. Odzyskiwanie pamięci w tle jest wykonywane na co najmniej jednym dedykowanym wątku, w zależności od tego, czy jest to stacja robocza, czy serwer GC, i dotyczy tylko kolekcji generacji 2.

Odzyskiwanie pamięci w tle jest domyślnie włączone. Można ją włączyć lub wyłączyć za pomocą ustawienia konfiguracji gcConcurrent w aplikacjach .NET Framework lub ustawieniu System.GC.Concurrent w aplikacjach .NET Core i .NET 5 lub nowszych.

Uwaga

Odzyskiwanie pamięci w tle zastępuje współbieżne odzyskiwanie pamięci i jest dostępne w programie .NET Framework 4 i nowszych wersjach. W programie .NET Framework 4 jest obsługiwana tylko w przypadku odzyskiwania pamięci stacji roboczej . Począwszy od programu .NET Framework 4.5, odzyskiwanie pamięci w tle jest dostępne zarówno dla stacji roboczej , jak i odzyskiwania pamięci serwera .

Kolekcja efemerycznej generacji podczas odzyskiwania pamięci w tle jest znana jako odzyskiwanie pamięci pierwszego planu . Po wystąpieniu odzyskiwania pamięci pierwszego planu wszystkie zarządzane wątki są zawieszone.

Gdy odzyskiwanie pamięci w tle jest w toku i przydzielono wystarczającą liczbę obiektów w generacji 0, clR wykonuje odzyskiwanie pamięci na pierwszym planie generacji 0 lub 1. generacji. Dedykowany wątek odzyskiwania pamięci w tle sprawdza się w częstych bezpiecznych punktach w celu ustalenia, czy istnieje żądanie odzyskiwania pamięci na pierwszym planie. Jeśli tak jest, kolekcja w tle zawiesza się tak, aby odzyskiwanie pamięci na pierwszym planie mogło wystąpić. Po zakończeniu odzyskiwania pamięci na pierwszym planie wątki odzyskiwania pamięci w tle i wątki użytkownika zostaną wznowione.

Odzyskiwanie pamięci w tle usuwa ograniczenia alokacji nałożone przez współbieżne odzyskiwanie pamięci, ponieważ efemeryczne odzyskiwanie pamięci może wystąpić podczas odzyskiwania pamięci w tle. Odzyskiwanie pamięci w tle może usuwać martwe obiekty w efemerycznych pokoleniach. Może również rozszerzyć stertę w razie potrzeby podczas odzyskiwania pamięci generacji 1.

Stacja robocza w tle a serwer GC

Począwszy od programu .NET Framework 4.5, odzyskiwanie pamięci w tle jest dostępne dla serwera GC. Funkcja GC w tle jest domyślnym trybem odzyskiwania pamięci serwera.

Odzyskiwanie pamięci serwera w tle działa podobnie do odzyskiwania pamięci stacji roboczej w tle, ale istnieje kilka różnic:

  • Odzyskiwanie pamięci stacji roboczej w tle używa jednego dedykowanego wątku odzyskiwania pamięci w tle, podczas gdy odzyskiwanie pamięci serwera w tle używa wielu wątków. Zazwyczaj istnieje dedykowany wątek dla każdego procesora logicznego.

  • W przeciwieństwie do wątku odzyskiwania pamięci w tle stacji roboczej wątki GC serwera w tle nie są przekroczone limitu czasu.

Na poniższej ilustracji przedstawiono odzyskiwanie pamięci na stacji roboczej w tle wykonywane w osobnym dedykowanym wątku:

Background workstation garbage collection

Na poniższej ilustracji przedstawiono odzyskiwanie pamięci serwera w tle wykonywane na osobnych dedykowanych wątkach:

Background server garbage collection

Równoczesne odzyskiwanie pamięci

Napiwek

Ta sekcja dotyczy:

  • Program .NET Framework 3.5 i starsze wersje dla odzyskiwania pamięci stacji roboczej
  • Program .NET Framework 4 i starsze wersje na potrzeby odzyskiwania pamięci serwera

Współbieżne śmieci są zastępowane przez odzyskiwanie pamięci w tle w nowszych wersjach.

W przypadku stacji roboczej lub serwera odzyskiwania pamięci można włączyć współbieżne odzyskiwanie pamięci, co umożliwia jednoczesne uruchamianie wątków z dedykowanym wątkiem, który wykonuje odzyskiwanie pamięci przez większość czasu trwania odzyskiwania pamięci. Ta opcja ma wpływ tylko na odzyskiwanie pamięci w generacji 2; generacje 0 i 1 są zawsze niebieżne, ponieważ kończą się szybko.

Współbieżne odzyskiwanie pamięci umożliwia interakcyjnym aplikacjom bardziej dynamiczne reagowanie przez zminimalizowanie wstrzymywania dla kolekcji. Zarządzane wątki mogą nadal działać przez większość czasu, gdy jest uruchomiony współbieżny wątek odzyskiwania pamięci. Ten projekt powoduje krótsze wstrzymanie podczas odzyskiwania pamięci.

Współbieżne odzyskiwanie pamięci jest wykonywane na dedykowanym wątku. Domyślnie clR uruchamia odzyskiwanie pamięci stacji roboczej z równoczesnym odzyskiwaniem pamięci włączone na komputerach z jednym procesorem i wieloma procesorami.

Na poniższej ilustracji przedstawiono współbieżne odzyskiwanie pamięci wykonywane w osobnym dedykowanym wątku.

Concurrent Garbage Collection Threads

Zobacz też